浅谈从一道面试测试题谈谈对Nodejs编程的理解
发布于 15小时前 作者 SweetHeartXi 191 次浏览 最后一次编辑是 14小时前 来自 分享

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(附测试题)史上最奇特招聘

4 回复

三个闭包实例(value1,value2,value3)可以理解为三个异步事件,其中的每个事件机制当中由于存在简单的数学计算,每计算一次闭包setTimeout被实例化一次,循环计算3次闭包setTimeout被实例化3次,根据其作用域得出最终的结果。形成了for循环利用闭包成功处理3个作用域不同的事件,返回三个事件各自的结果。由于Nodejs的单线程不适合处理数学运算。所以这个程序对加深Nodejs作用域、闭包、事件驱动、异步I/O、单线程、不适合处理数学运算的理解有帮助。

回到顶部