为了账号安全,请及时绑定邮箱和手机立即绑定

JS闭包问题

JS闭包问题

青春有我 2019-02-22 19:19:54
从C++/Java转过来学JS有点不习惯,JS闭包这个表达式()()连续两个括号?为什么把还可以把function括起来然后又加一个()啊。  比如这个,把这个迭代器function括起来,加参数(i),外面的括号(0)就表示调用0了,把0传进去i。还有这个,var a = 6;(function() {var a = 5;})();a = 6//true。这个闭包创造新的作用域,闭包一定是()()这种表达式吗?为什么是这个规范。抱歉,初学JS,很不习惯。
查看完整描述

1 回答

?
白猪掌柜的

TA贡献1893条经验 获得超10个赞

首先要明确的是js中的基本概念


作用域

js主要的作用域形式就是全局作用域与函数作用域(局部作用域),没有块级作用域,不过在ES6中用let声明的变量具有块级作用域的效果。

执行环境、变量对象

执行环境分为全局执行环境和函数执行环境,就是当前代码的执行上下文,简单说就是定义了变量或函数访问其他数据的权限,控制着变量和函数的可见性与生命周期,每个执行环境都有一个与之关联的对象即变量对象,环境中定义的所有变量和函数都保存在这个对象中。全局环境是最外围的,而每个函数有自己的执行环境。

作用域链

代码在一个环境中执行时就会创建变量对象的一个作用域链,作用域链前端始终是当前执行环境的变量对象,下一个变量对象来自包含(外部的)环境,全局执行环境的变量对象始终是作用域链的最后一个对象,就像洋葱一样,如果你愿意一层一层剥开它的心,就很好理解了。

立即执行函数表达式

()这括号有两种意义,一是指代一个表达式,二是表示函数执行。


//函数表达式

var fuc = function() {};

//匿名函数直接执行(立即执行函数表达式)

(function(){})();

上面的效果就是很好的创建了一个作用域,可以做到外部作用域中不能够访问内部,就好像被屏蔽了一样。所以上面你在全局环境声明变量a又在函数环境声明a两个就没什么联系了,两个处于不同的变量对象内部,虽然名字相同。但是如果你在函数内部不声明a,而是直接a = 5赋值,则外部的a会改变,这是因为内部通过作用域链访问到外部的变量并赋值。理解了作用域链就很好理解这些问题了。

最后,什么是闭包?,答:就是能访问局部变量的函数!!方式是如下(实质还是通过作用域链)


var funcName = function() {

    return function() {

    }

}


查看完整回答
反对 回复 2019-02-25
  • 1 回答
  • 0 关注
  • 586 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信