var data =[];
for(var i=0;i<3;i++){
data[i] = function(i){
console.log(i);
}
}
data[0]();
data[1]();
data[2]();
1、请问一下为何执行data[0]时是undefined?
2、for循环执行后,会分配3个空间,放着3个function吗?如果是,i的值会传进去吗?
3、执行结果是undefined,是因为执行完for循环完,没有3个空间,都释放了吗?还是其他原因
4、如果像传进去i,要用闭包(我已经试过了),是闭包会分配空间一直不释放吗?有其他方法吗?
你这个例子跟闭包没有半毛钱的关系, 你的
data
数组中只是定义了三个函数,没有调用, 把你的代码改为下面的等价代码, 应该道理就很明显了这个例子的原理,发条橙子的作用域链解释得更清楚
如果你想体验
闭包
的话, 例子应该像下面这样如果你想体验
IIFE
的话, 例子应该像下面这样如果你想体验
闭包+IIFE
的话, 例子应该像下面这样因为js中有了
作用域链
和闭包
的存在,所以会有上面第一段代码这样的输出,这往往不是开发者所预期和需要的结果,所以在ES5中,大家研究出了IIFE+闭包
这种hack式的手法,来解决这个问题,使代码的运行结果更符合预期。对于防止闭包的误用,ES6引入了
块作用域(block)
,模块(module)
和箭头函数(arrow function)
, 可以减少部分对于IIFE+闭包
的依赖参考资料:
闭包: http://speakingjs.com/es5/ch0...
IIFE: http://speakingjs.com/es5/ch1...
IIFE in ES6: http://exploringjs.com/es6/ch...
IIFE in ES6: http://exploringjs.com/es6/ch...