Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/443.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 setTimeout内部工作不正常;for loop";_Javascript_Loops_For Loop_Iteration_Settimeout - Fatal编程技术网

Javascript setTimeout内部工作不正常;for loop";

Javascript setTimeout内部工作不正常;for loop";,javascript,loops,for-loop,iteration,settimeout,Javascript,Loops,For Loop,Iteration,Settimeout,当然,代码只做你让它做的事情 但我不明白为什么在下面的代码中: var a = { 0: "Hi", 1: "Bye" } for (var b in a) { setTimeout(function () { console.log(b); }, 1000); } 而不是先安慰“0”再安慰“1” 我只得到了两次“1” 我不知道为什么会这样。对于我正在制作的脚本,我需要这样的设置,但我也遇到了同样的问题。这是因为您对闭包的使用是错误的 在这种情

当然,代码只做你让它做的事情

但我不明白为什么在下面的代码中:

var a = {
    0: "Hi",
    1: "Bye"
}

for (var b in a) {
    setTimeout(function () {
        console.log(b);
    }, 1000);
}
而不是先安慰“0”再安慰“1”

我只得到了两次“1”


我不知道为什么会这样。对于我正在制作的脚本,我需要这样的设置,但我也遇到了同样的问题。

这是因为您对闭包的使用是错误的

在这种情况下,您正在
setTimeout
回调中使用闭包变量
b
,但是变量
b
的值在执行回调之前不会被查找,然后更新为对象中的最后一个值

这种情况下的解决方案之一是创建一个局部闭包,如下所示

for (var b in a) {
    (function(c){
        setTimeout(function () {
            console.log(c);
        }, 1000);
    })(b)
}

演示:

这是因为您对闭包的使用是错误的

在这种情况下,您正在
setTimeout
回调中使用闭包变量
b
,但是变量
b
的值在执行回调之前不会被查找,然后更新为对象中的最后一个值

这种情况下的解决方案之一是创建一个局部闭包,如下所示

for (var b in a) {
    (function(c){
        setTimeout(function () {
            console.log(c);
        }, 1000);
    })(b)
}

演示:

您也可以这样做

for (var b in a) {
    setTimeout(console.log.bind(console, b), 1000);
}
还是像这样

for (var b in a) {
    setTimeout(function(c) {
        console.log(c)
    }.bind(null, b), 1000);
}
// compatibility varies
for (var b in a) {
    setTimeout(function(c) {
        console.log(c)
    }, 1000, b);
}
甚至像这样

for (var b in a) {
    setTimeout(function(c) {
        console.log(c)
    }.bind(null, b), 1000);
}
// compatibility varies
for (var b in a) {
    setTimeout(function(c) {
        console.log(c)
    }, 1000, b);
}

你也可以这样做

for (var b in a) {
    setTimeout(console.log.bind(console, b), 1000);
}
还是像这样

for (var b in a) {
    setTimeout(function(c) {
        console.log(c)
    }.bind(null, b), 1000);
}
// compatibility varies
for (var b in a) {
    setTimeout(function(c) {
        console.log(c)
    }, 1000, b);
}
甚至像这样

for (var b in a) {
    setTimeout(function(c) {
        console.log(c)
    }.bind(null, b), 1000);
}
// compatibility varies
for (var b in a) {
    setTimeout(function(c) {
        console.log(c)
    }, 1000, b);
}

更像是
setTimeout(console.log.bind(console,b)
@Musa,
console.log.bind(null,b)
也适用于这种情况。
console.log
不需要自己的上下文来工作。所以你不会得到
非法调用
?@Musa,嗯,在
node-0.10.12
中它可以使用
null
,但在浏览器中它看起来需要
控制台
。感谢你捕捉到了这种不同之处。我只做节点工作,所以我需要从未注意到:)更像是
setTimeout(console.log.bind(console,b)
@Musa,
console.log.bind(null,b)
也适用于这种情况。
console.log
不需要自己的上下文来工作。所以你不会得到
非法调用
?@Musa,嗯,在
node-0.10.12
中它可以使用
null
,但在浏览器中它看起来需要
控制台
。感谢你捕捉到了这种不同之处。我只做节点工作,所以我需要从未注意到:)