javascript - 关于闭包的问题
本文介绍了javascript - 关于闭包的问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
问 题
为什么这段代码输出不是10个9,而是0-9?
function test() {
for (var i = 0; i < 10; i++) {
setTimeout(console.log(i), 1000);
}
}
test();
讲闭包的时候经常会用到这个例子(代码不完全相同)。为什么i的值不等于循环结束的9?
下面这个例子是10个9,区别在什么地方?加一层匿名函数不应该形成局部作用域吗,为什么取得了相反的效果?
function test() {
for (var i = 0; i < 10; i++) {
setTimeout(function() {
console.log(i)
}, 1000);
}
}
test();
=========================
给后来碰到同样问题的同学:
用户『kikong』和『苏哈哈哈』的答案都是比较好的,思路都很清晰。
其他用户答案也是对的,只是表述有点简略,看懂了就能理解。
我本来是想试试『let』,没想到牵涉出这个问题。
解决方案
function test() {
for (var i = 0; i < 10; i++) {
setTimeout(console.log(i), 1000);
}
}
test();
==》
function test() {
for (var i = 0; i < 10; i++) {
console.log(i);
setTimeout(undefined, 1000);
}
}
test();
1.setTimeout作为一个函数,在调用的时候需要对传入的参数求值;
2.setTimeout并不表示本身会被延迟执行
3.setTimeout是为指定的传入函数对象指定一个调用的时间点,并注册到JS的事件执行队列中
console.log(i)
作为一个调用语句在循环过程中被执行,返回的结果为undefined;
这篇关于javascript - 关于闭包的问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文