let
首先咱们从下面这段代码说起:
for (var i = 0; i < 10; i++) {
setTimeout(function() { console.log(i); }, 100 * i);
}
看一下结果:
10
10
10
10
10
10
10
10
10
10
setTimeout在若干毫秒后执行一个函数,并且是在for循环结束后。 for循环结束后,i的值为10。 所以当函数被调用的时候,它就只会打印出 10!这并不是我们期望得到的结果,大多数人期望输出结果是这样:
0
1
2
3
4
5
6
7
8
9
通常大多数人会想到的解决方法是利用闭包:
for (var i = 0; i < 10; i++) {
callback(i);
}
function callback(i) {
setTimeout(function () { console.log(i); }, 100 * i);
}
输出结果:
0
1
2
3
4
5
6
7
8
9
道行深点的人会想到利用立即执行的函数表达式(IIFE),当然这也是利用了闭包的原理:
for (var i = 0; i < 10; i++) {
(function(i) {
setTimeout(function() { console.log(i); }, 100 * i);
})(i);
}
结果同样会输出ÿ