JavaScript容易理解错误的例子

1
for (var i = 1; i <=5; i++){ setTimeout(function timer() { console.log(i); }, i*1000); }//输出五次6
2
for (let i = 1; i <=5; i++){ setTimeout(function timer() { console.log(i); }, i*1000); } //输出1,2,3,4,5
3
for (var i = 1; i <=5; i++){ (function () { var j = i; setTimeout(function timer() { console.log(j); }, j*1000); })(i);} //输出1,2,3,4,5
4
改进这段代码
for (var i =1; i<=5; i++){ (function (j) { setTimeout(function timer() { console.log(j); }, j*1000); })(i);}
代码1中到底有什么缺陷导致它的行为同语义所暗示的不一致呢?
缺陷是我们试图假设循环中的每个迭代在运行时都会给自己“捕获”一个i的副本,但是根据作用域的工作原理,实际情况是尽管循环中的五个函数实在各个迭代中分别定义的,但是他们都被封闭在一个共享的全局作用域中,因此实际上只有一个i.

 
 
原文地址:https://www.cnblogs.com/jeff-ideas/p/10540352.html