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