这到底是怎么回事?循环中的Javascript计时器
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了这到底是怎么回事?循环中的Javascript计时器,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1714字,纯文字阅读大概需要3分钟。
内容图文
有人可以清楚地分解这里发生的事情吗?
function timerCheck() {
for(var i=0; i<5; i++) {
setTimeout(function() {
console.log("Hello" + i);
}, 3000);
}
}
因此,如您所知,调用此函数将无法正常工作.最终将发生的事情是该函数一次被调用5次,而每次设置为5.这将是3秒后的输出:
Hello5
Hello5
Hello5
Hello5
Hello5
我也了解使用setInterval方法是解决此类问题的正确方法,但是我很好奇这里的实际情况.我真的很想了解Javascript是如何工作的.请注意,我没有计算机科学背景,只是一个自学成才的编码员.
解决方法:
这可以帮助您了解正在发生的事情:
function timerCheck() {
for(var i=0; i<5; i++) {
console.log("Hi" + i);
setTimeout(function() {
console.log("Hello" + i);
}, 3000);
console.log("Bye" + i);
}
}
你会看到的
Hi0
Bye0
Hi1
Bye1
Hi2
Bye2
Hi3
Bye3
Hi4
Bye4
立即打印到控制台,因为循环的所有五个迭代都非常快地完成,然后在五秒钟后您将看到:
Hello5
Hello5
Hello5
Hello5
Hello5
因为超时(所有时间都是在大约同一时间设置的)都一次发生,并且由于循环已经完成:i == 5.
这是由i的范围引起的.在timerCheck()中声明变量i之后,变量i的作用域无处不在.在setTimeout集合的匿名函数中没有本地i,没有var i,并且没有将i作为函数的参数给出.
您可以使用闭包轻松解决此问题,该闭包将返回具有i本地副本的函数:
function timerCheck() {
for(var i=0; i<5; i++) {
setTimeout((function(loc_i) {
return function() {
console.log("Hello" + loc_i);
};
})(i), 3000);
}
}
将输出:
Hello0
Hello1
Hello2
Hello3
Hello4
要了解这一点:
(function(loc_i) {
return function() {
console.log("Hello" + loc_i);
};
})(i)
您必须知道可以在Javascript中立即执行功能. IE浏览器(function(x){console.log(x);})(‘Hi’);将“ Hi”输出到控制台.因此,上面的外部函数仅接受一个参数(i的当前值),并将其存储到该函数的本地变量loc_i中.该函数立即返回一个新函数,该函数将“ Hello” loc_i打印到控制台.那就是传递给超时的函数.
我希望一切都说得通,如果您仍然不清楚某个地方,请告诉我.
内容总结
以上是互联网集市为您收集整理的这到底是怎么回事?循环中的Javascript计时器全部内容,希望文章能够帮你解决这到底是怎么回事?循环中的Javascript计时器所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。