JavaScript最有意思的就是闭包,很简单,闭包的出现就是解决变量作用域的问题
看看这个例子
for (var i = 0; i < 2; i++) {
(function(n){
console.log(n);
})(i)
}
// Output:
// 0
// 1
以上例子就是需要在for循环中能够接收到每一个变量,于是有些朋友就说了,直接console.log不就好了吗?
for (var i = 0; i < 2; i++) {
console.log(i);
}
// Output:
// 0
// 1
其实,以上也能正确打印出来,那是因为代码还没有遇到异步执行的情况,当你需要异步执行又要需要过程环境变量
for (var i = 0; i < 2; i++) {
setTimeout(function(){
console.log(i);
}, 2000)
}
// Output:
// 2
// 2
两次打印的都是i,因为异步执行了console.log语句,而最后当执行到console.log时i的变量就是2,如果你想在console.log打印时是过程中的变量,就要使用闭包了
for (var i = 0; i < 2; i++) {
(function(n){
setTimeout(function(){
console.log(n);
}, 2000)
})(i)
}
// Output:
// 0
// 1
当然,我不推荐滥用闭包,那会使得程序不容易维护,比如以上例子可以这么简单实现
var say = function(i) {
setTimeout(function(){
console.log(i)
}, 2000)
}
for (var i = 0; i < 2; i++) {
say(i)
}
// Output:
// 0
// 1
以上方式就是定义了一个say()
方法来解决过程变量的问题