前端基础进阶

阅读了博客的一个内容,感觉挺不错的。链接如下:

前端基础进阶(一):内存空间详细图解
前端基础进阶(二):执行上下文详细图解
前端基础进阶(三):变量对象详解
前端基础进阶(四):详细图解作用域链与闭包

其中一个问题的这里补充一下:

利用闭包,修改下面的代码,让循环输出的结果依次为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>


猜你喜欢

转载自blog.csdn.net/linyeban/article/details/55104344