代码一 (function(){var a=20; window.func=function(){alert(a)}})()
代码二var func=(function(){var a=20; return function(){alert(a)}})()
代码一这种形式是闭包么?俩个函数都可以一直访问a变量,他们的区别是什么
闭包的形成 必须有return关键字吗?
代码一 (function(){var a=20; window.func=function(){alert(a)}})()
代码二var func=(function(){var a=20; return function(){alert(a)}})()
代码一这种形式是闭包么?俩个函数都可以一直访问a变量,他们的区别是什么
闭包的形成 必须有return关键字吗?
代码一是闭包,把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());
不见得就得返回return,比如:
1.事件回调
javascript
var 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.定时器
javascript
for(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()不是闭包。
javascript
var func=(function(){var a=20; return function(){alert(a)}})() //代码二
代码二是一个闭包,因为立即执行的匿名函数的返回值是一个函数,并且返回的那个函数有着与其相关联的局部变量a,所以当把这个函数赋值给func时,相当于a对于func()这个函数也是可见的,所以可以访问a。func()是闭包。
8 回答4.6k 阅读✓ 已解决
6 回答3.3k 阅读✓ 已解决
5 回答2.8k 阅读✓ 已解决
5 回答6.3k 阅读✓ 已解决
4 回答2.2k 阅读✓ 已解决
4 回答2.7k 阅读✓ 已解决
3 回答2.4k 阅读✓ 已解决
一般来讲,js的所有函数都是闭包,但是匿名函数可以在其它函数内部创建,而且可以访问到外层的局部变量,相对来讲功能比较强一点。然而这两种函数都一样,return可有可无。如果一个函数没有return,那它的返回值默认是
undefined
。