26212070
var value1 = 0, value2 = 0, value3 = 0;
for ( var i = 1; i <= 3; i++) {
var i2 = i;
(function() {
var i3 = i;
setTimeout(function() {
value1 += i;
value2 += i2;
value3 += i3;
}, 1);
})();
}
setTimeout(function() {
console.log(value1, value2, value3);
}, 100);
value1=12
value2=9
value3=6
wdx345 <- add wechat
此段程序应该这样理解 循环语句条件下:
- 匿名自执行函数与闭包的关系
(function() {
var i3 = i;
setTimeout(function() {
value1 += i; value2 += i2; value3 += i3;
}, 1);
})();
的作用域与setTimeout的闭包引用i在for循环下i对应的4,4,4的3个不同闭包实例相加value1=12
- 闭包外部匿名函数
function() {
var i3 = i;
setTimeout(function() {
value1 += i;
value2 += i2;
value3 += i3;
}, 1);
}
的作用域与setTimeout的闭包引用i2在for循环下i对应的3,3,3的3个不同闭包实例相加value2=9
- 闭包内部匿名函数
function() {
value1 += i;
value2 += i2;
value3 += i3;
}
的作用域与setTimeout的闭包引用i3在for循环下i对应的1,2,3的3个不同闭包实例相加value3=6
形成3个闭包相加的三个匿名函数的事件循环的异步输出,即个匿名函数事件驱动的经典题目。 包含面向对象封装、继承、多态的思想,大赞!好题!