我知道使用此代码将0到9记录的方法之一:
编辑:Source
for(var i = 0; i < 10; i++) { setTimeout(function() { console.log(i); }),10) }
是使setTimeout自我调用并将i作为参数传递,如下所示:
for(var i = 0; i < 10; i++) { setTimeout((function(i) { console.log(i); })(i),10) }
但我已经测试过setTImeout自我调用而不传递i,它仍然有效:
for(var i = 0; i < 10; i++) { setTimeout((function() { console.log(i); })(),10) }
我的问题:
>为什么即使不将i作为参数传递也能工作?
>是否有必要通过我?
解决方法
问题
这不是关闭.
for(var i = 0; i < 10; i++) { setTimeout((function(i) { console.log(i); })(i),10) }
setTimeout实际上需要一个函数作为参数,但是你让它立即调用.所以它立即记录i的值,而不是等待. setTimeout现在已将您的匿名函数作为第一个参数返回,该参数未定义.
和这里一样:
for(var i = 0; i < 10; i++) { setTimeout((function() { console.log(i); })(),10) }
它立即执行,不等待10ms.唯一的区别是你没有将i作为参数传递,但是它将在父作用域中查找名为i的变量 – 并且只有一个.
如果您将时间设置为例如,您将看到立即调用您的匿名函数一秒钟(1000).
解
真正的闭包看起来像这样:
没有参数:你会看到10次10,因为在执行内部函数时循环已经完成,这意味着当时我等于10:
for(var i = 0; i < 10; i++) { (function() { setTimeout(function() { console.log(i); },10); })(); }
使用参数 – 您将获得预期的结果:
for(var i = 0; i < 10; i++) { (function(i) { setTimeout(function() { console.log(i); },10); })(i); }