这个是臭名昭著的循环加闭包。匿名函数调用的时候,会在作用域链上找i
,最后它会在外层函数的作用域里面找到这个变量,而这个变量的值就是10,所有的匿名函数都会返回10。
这个办法就是每次定义匿名函数的时候都把相应的i
截取下来,而不需要在调用的时候去作用域链找这个值。
还有一个用let
的:
经常很多地方会说,用这个办法能解决是因为 let 能创建块级作用域,但是我从来没理解为什么块级作用域和这有什么关系,直到今天看 NCZ 的 :
This loop works exactly like the loop that used var and an IIFE but is,arguably,cleaner. The let declaration creates a new variable i each time through the loop,so each function created inside the loop gets its own copy of i. Each copy of i has the value it was assigned at the beginning of the loop iteration in which it was created. The same is true for for-in and for-of loops.
It’s important to understand that the behavior of let declarations in loops is a specially-defined behavior in the specification and is not necessarily related to the non-hoisting characteristics of let. In fact,early implementations of let did not have this behavior,as it was added later on in the process.
如果 let 做的仅仅是创建一个块级作用域的话,循环里面的匿名函数还是要在作用域链上去找i
,区别只不过是之前的i
是在外层函数的变量对象里找到的,而现在是在循环块的变量对象里找到的,而已。重要的是,let 使得每次循环都给了匿名函数一个i
的值,它不必在调用的时候再去作用域链上找了。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。