This question already has answers here:
JavaScript closure inside loops – simple practical example
                                
                                    (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/

10-09 16:22
查看更多