for循环 + setTimeout 结合一些示例(前端面试题)
最近在翻看以前的老书《node.js开发指南》,恰好碰到 for 循环 + setTimeout 的经典例子,于是重新梳理了思路并记录下。setTimeout :延时 delay 毫秒之后,啥也不管,直接将回调函数加入事件队列。因为 for 循环会先执行完,这时五个 setTimeout 的回调全部塞入了事件队列中,然后 1 秒后一起执行了。因为 setTimeout 的 console.log; 的i是 var 定义的,所以是函数级的作用域,不属于 for 循环体,属于 global。这样 console.log; 中的i就保存在每一次循环生成的立刻执行函数中的作用域里了。let 为代码块的作用域,所以每一次 for 循环,console.log; 都引用到 for 代码块作用域下的i,因为这样被引用,所以 for 循环结束后,这些作用域在 setTimeout 未执行前都不会被释放。
用户评论