JavaScript 作用域和闭包
时间:2014-03-28 20:07:24
收藏:0
阅读:462
看下面的例子:
var i, list = [];
for (i = 0; i < 2; i += 1) {
list.push(function(){
console.log(i);
});
}
list.forEach(function(func){
func();
});
for (i = 0; i < 2; i += 1) {
list.push(function(){
console.log(i);
});
}
list.forEach(function(func){
func();
});
我们将得到两次 "2" ,而不是预期的 "1" 和 "2" ,这是因为在 list
中的两个函数访问的变量
i
都是其上一层作用域的同一个变量。
我们改动下代码,以利用闭包来解决这个问题:
var i, list = [];
for (i = 0; i < 2; i += 1) {
list.push((function(j){
return function(){
console.log(j);
};
})(i));
}
list.forEach(function(func){
func();
});
for (i = 0; i < 2; i += 1) {
list.push((function(j){
return function(){
console.log(j);
};
})(i));
}
list.forEach(function(func){
func();
});
外层的“立即执行函数”接收了一个参数变量 i
,在其函数内以参数
j
的形式存在,它与被返回的内层函数中的名称 j
指向同一个引用。外层函数执行并退出后,参数
j
(此时它的值为 i
的当前值)成为了其内层函数的状态的一部分被保存了下来
JavaScript 作用域和闭包,布布扣,bubuko.com
原文:http://www.cnblogs.com/glenblogs/p/3629841.html
评论(0)