JavaScript回调函数中的变量范围

Eth*_*han 19 javascript jquery

我希望下面的代码警告"0"和"1",但它会两次警告"2".我不明白原因.不知道这是不是jQuery的问题.另外,如果这些帖子的标题和标签不准确,请帮我编辑标题和标签.

<html>
    <head>
        <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
        <script type="text/javascript">
            $(function() {
                for (var i=0; i<2; i++) {
                    $.get('http://www.google.com/', function() {
                        alert(i);
                    });
                }
            });
        </script>
    </head>
    <body>
    </body>
</html>
Run Code Online (Sandbox Code Playgroud)

SLa*_*aks 38

您将i在所有回调中共享单个变量.

因为Javascript闭包通过引用捕获变量,所以回调将始终使用当前值i.因此,当循环执行后jQuery调用回调时,i将始终如此2.

您需要i将参数作为参数引用到单独的函数中.

例如:

function sendRequest(i) {
    $.get('http://www.google.com/', function() {
        alert(i);
    });
}

for (var i = 0; i < 2; i++) {
    sendRequest(i);
}
Run Code Online (Sandbox Code Playgroud)

这样,每个回调都将有一个带有单独i参数的单独闭包.


Tom*_*lak 13

替代SLaks的回答

$(function() {
    for (var i=0; i<2; i++) {
        $.get('http://www.google.com/', function(i) {
            return function() { alert(i); }
        }(i));
    }
});
Run Code Online (Sandbox Code Playgroud)