阅读了博客的一个内容,感觉挺不错的。链接如下:
前端基础进阶(一):内存空间详细图解
前端基础进阶(二):执行上下文详细图解
前端基础进阶(三):变量对象详解
前端基础进阶(四):详细图解作用域链与闭包
其中一个问题的这里补充一下:
利用闭包,修改下面的代码,让循环输出的结果依次为1, 2, 3, 4, 5
for (var i=1; i<=5; i++) {
setTimeout( function timer() {
console.log(i);
}, i*1000 );
}
不能输出正确结果,因为循环中setTimeout接受的参数函数通过闭包访问变量i。javascript运行环境为单线程,setTimeout注册的函数需要等待线程空闲才能执行,此时for循环已经结束,i值为6.五个定时输出都是6 修改方法:将setTimeout放在函数立即调用表达式中,将i值作为参数传递给包裹函数,创建新闭包
for (var i = 1; i <= 5; i++) {
(function(i) {
setTimeout(function timer() {
alert(i);
}, i * 1000);
}(i));
}
</script>