javascript在1秒后打印一个值
我只想在1秒后在for循环中打印一个值,但是当我在firebug中运行代码时,每次运行代码时都会打印出意外的值。不知道发生了什么javascript在1秒后打印一个值,javascript,for-loop,firebug,Javascript,For Loop,Firebug,我只想在1秒后在for循环中打印一个值,但是当我在firebug中运行代码时,每次运行代码时都会打印出意外的值。不知道发生了什么 for(var k=0; k<3; k++) { setTimeout(function() { console.log(k); },1000); } for(var k=0;k您需要在函数内附上k变量的副本,否则函数将引用k变量,函数执行时该变量的值为3: for(var k=0; k<3; k++) { (function(k_copy) {
for(var k=0; k<3; k++) {
setTimeout(function() { console.log(k); },1000);
}
for(var k=0;k您需要在函数内附上k
变量的副本,否则函数将引用k
变量,函数执行时该变量的值为3:
for(var k=0; k<3; k++) {
(function(k_copy) {
setTimeout(function() { console.log(k_copy); },1000);
})(k); // immediately execute
}
for(var k=0;k您看到的第一个整数是从返回的。
它是一个数字指针,指向可以在中使用的超时
除此之外,还必须使用闭包来打印正确的值
for(var k=0; k<3; k++) {
(function(k) {
setTimeout(function() {
console.log(k);
},1000);
})(k);
}
for(var k=0;k3635和3686是setTimeout函数的标识符,必要时用于清除超时。要打印0,1,2,请使用下一个代码
for(var k=0; k<3; k++) {
(function(k){
setTimeout(function() { console.log(k); },1000);
})(k);
}
for(var k=0;k您看到的四位数字是setTimeout
的返回值,您可以稍后使用它来取消计时器
setTimeout
方法将其参数设置为稍后调用,并立即继续当前函数。因此,您的代码快速完成for循环,调用setTimeout三次。循环完成后,k
为3
然后,一秒钟后,超时触发,并将k(3
)记录到控制台
我相信您只会看到一次3
输出的原因是setTimeout
只会为给定函数设置一个超时。您正在传递完全相同的函数三次。但是,我没有看到在中指定此行为,因此它可能是实现定义的
我怀疑您想要的是在一秒钟后打印k
的三个不同值。为此,您实际上需要创建一个不同的变量,该变量的值不变。您可以使用一个额外的函数来执行此操作,该函数返回一个函数:
var makefunc = function (k2) {
return function() { console.log(k2); };
}
for(var k=0; k<3; k++) {
setTimeout(makefunc(k),1000);
}
我建议在异步JavaScript上查找一些资源,因为了解这一点在这种情况下会有所帮助。JavaScript是单线程的,在调用回调函数之前会等待。请这样想:
k=0;进入循环,调用setTimeout(),这是一个异步函数;回调函数被放入队列,代码不执行就继续运行
k=1;下一次循环迭代,call setTimeout();回调函数被放入队列,代码继续运行,而不执行它
k=2;下一次循环迭代,call setTimeout();回调函数被放入队列,代码继续运行,而不执行它
k=3;仅记录、3635(或其他一些意外数字)的k失败是由于在控制台中运行该示例。它是您在代码中忽略的最后一次setTimeout
调用的返回值,但显示在控制台中。我将在结束时再次查看。谢谢。我感谢您的解释。我想您会发现使用的数据结构是队列,而不是堆栈。添加1,2,3后,元素队列中可访问的是1,而堆栈中可访问的是3。是的,你说得对,它更像一个队列。谢谢。更新了帖子。谢谢你。阿迪莫罗。你的解释真的帮助我理解了这种情况。你介意向我解释为什么(函数(k_copy)…)(k)将立即执行?如果仔细查看语法,您可以看到它是一个函数定义function(){..}
,被括号包围(括号将其转换为函数表达式,几乎相同),后面是调用函数的语法f()
。函数在那里定义,并且在定义之后立即调用。通过搜索iLife阅读更多内容。谢谢!现在我知道这些数字是什么了。
var makefunc = function (k2) {
return function() { console.log(k2); };
}
for(var k=0; k<3; k++) {
setTimeout(makefunc(k),1000);
}
for(var k=0; k<3; k++) {
setTimeout(function(k) { return function() { console.log(k); }; }(k), 1000);
}
for(var k=0; k<3; k++) {
(function(k) {
setTimeout(function() {
console.log(k);
},1000);
})(k);
}