This question already has answers here:
JavaScript closure inside loops – simple practical example
(44个答案)
5年前关闭。
我只需要使用部分应用程序将数据传递到回调中,就发现我需要一个间接层,以防止循环的后续运行更改传递给回调的数据。
请参阅此处以获取一个非常简单的工作示例:http://jsfiddle.net/s5gVj/
(如果jsfiddle是自我解释的,请随时直接跳到下面的问题)
没有间接
这将始终将标签设置为“按下按钮1”。
无论按下哪个按钮,都会发生这种情况。
通过功能间接
同时,在中间使用功能可纠正问题
对于第一个按钮,结果将为“按下按钮0”
对于第二个按钮,将为“按下按钮1”。
为什么会这样?关于函数调用,是否有一些特殊的方法来确保变量被复制,从而不再引用相同的数据,或者还存在其他问题?
我希望在for循环中声明的变量会在每次迭代时重新创建,因此每次迭代都是独立的,但是我想不是这样吗?
(44个答案)
5年前关闭。
我只需要使用部分应用程序将数据传递到回调中,就发现我需要一个间接层,以防止循环的后续运行更改传递给回调的数据。
请参阅此处以获取一个非常简单的工作示例:http://jsfiddle.net/s5gVj/
(如果jsfiddle是自我解释的,请随时直接跳到下面的问题)
没有间接
这将始终将标签设置为“按下按钮1”。
无论按下哪个按钮,都会发生这种情况。
for(var i = 0 ; i < buttons.length ; i++)
{
var buttonID = i;
$(buttons[i]).click(
function(e)
{
$("label").html("Button " + buttonID + " pressed.");
});
}
通过功能间接
同时,在中间使用功能可纠正问题
对于第一个按钮,结果将为“按下按钮0”
对于第二个按钮,将为“按下按钮1”。
var buttonClickHandlerWithID =
function(buttonID)
{
return function(e)
{
$("label").html("Button " + buttonID + " pressed.");
}
}
for(var i = 0 ; i < buttons.length ; i++)
{
$(buttons[i]).click(buttonClickHandlerWithID(i));
}
为什么会这样?关于函数调用,是否有一些特殊的方法来确保变量被复制,从而不再引用相同的数据,或者还存在其他问题?
我希望在for循环中声明的变量会在每次迭代时重新创建,因此每次迭代都是独立的,但是我想不是这样吗?
最佳答案
JavaScript仅具有功能范围。函数中任何地方的所有var
声明(当然,嵌套函数中除外)都被视为出现在函数顶部。嵌套的{ ... }
块没有自己的作用域,这与C ++和Java等有很大区别。
关于javascript - JS中关于在循环中引用相同数据的变量的规则是什么? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24494436/