关于js的闭包

代码一 (function(){var a=20; window.func=function(){alert(a)}})()

代码二var func=(function(){var a=20; return function(){alert(a)}})()

代码一这种形式是闭包么?俩个函数都可以一直访问a变量,他们的区别是什么

闭包的形成 必须有return关键字吗?

阅读 5.4k
8 个回答

一般来讲,js的所有函数都是闭包,但是匿名函数可以在其它函数内部创建,而且可以访问到外层的局部变量,相对来讲功能比较强一点。然而这两种函数都一样,return可有可无。如果一个函数没有return,那它的返回值默认是undefined

代码一是闭包,把a的值每次加1测试下就ok了。
两者区别就是,代码一中func是内部函数,并且func被挂载到window下,所以func可以直接调用。代码二中func是外部函数并且被立即执行了,内部函数被当作返回值返回了,所以代码二func()时,也是直接调用的内部函数。
从结果来说两者是相同的,只是实现的方式略有不同。

子函数能够使用其父函数作用域的变量称为闭包.

接着楼上的说法 楼主所理解的闭包实际上是说a的值是不是能一直被保存调用 而如一楼所说广义上任何函数都是闭包 嵌套函数的闭包应该是要靠返回值 或者是保存到某属性里
或者用第3,4,5种写法 把return的匿名函数拆开 是一样的 最后 你代码写个分号吧
其实引用了就可以不一定要return
参考这个帖子我楼上和我的回答
http://segmentfault.com/q/1010000000397999#a-1020000000644788


function first() { var firstVar = 'first'; function second () { var firstVar = 'second'; return firstVar; } return second(); } console.log(first()); var func = (function(){ var a = 20; function func2() { return a; } return func2; })(); console.log(func()); function firstFunc() { var firstVar = 'first'; return (function second () { return firstVar; }()); } console.log(firstFunc());
新手上路,请多包涵

JS是词法作用域,函数可以访问它定义时的作用域中的变量

不见得就得返回return,比如:
1.事件回调

javascriptvar lists = document.querySelectorAll('#items>li');
for (var i = 0, j = lists.length; i < j; i++) {
    lists[i].onclick = function() {
        alert(i);
        // console.log(this.i);
    };
}

2.定时器

javascriptfor(var i=0;i<6;i++){
    setTimeout(function(){
        console.log(i);
    },6000);
}

首先,闭包就是返回的一个函数,以及这个函数在定义的时候与之相关联的环境变量。

javascript(function(){var a=20; window.func=function(){alert(a)}})() //代码一

代码一是一个立即执行的函数,开始时把局部变量a赋值为20,然后定义了一个全局函数func(),
如果调用func(),则可以访问变量a,代码一中的func()只是一个全局函数,但是它定义时的位置决定了局部变量a对这个函数是可见的,所以可以访问,func()不是闭包。

javascriptvar func=(function(){var a=20; return function(){alert(a)}})() //代码二

代码二是一个闭包,因为立即执行的匿名函数的返回值是一个函数,并且返回的那个函数有着与其相关联的局部变量a,所以当把这个函数赋值给func时,相当于a对于func()这个函数也是可见的,所以可以访问a。func()是闭包。

闭包就是从外层可以获取局部变量的引用。return只是一种方式,把内部函数或者局部变量返回给外界;全局属性的赋值也是一种形式。
代码一和代码二都是闭包。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏