Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javascript在1秒后打印一个值_Javascript_For Loop_Firebug - Fatal编程技术网

javascript在1秒后打印一个值

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) {

我只想在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) {
    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);
    }