jQuery函数中的范围

jor*_*ets 0 javascript jquery json

我很困惑,为什么在第一个console.log下面的代码中显示了对象,但第二个是未定义的.我该如何解决这个问题?

var listOfTweets = [];

for(var k = 0; k < search.length; k++){
    $.getJSON(searchURL, function(tweets){                              
        listOfTweets[k] = tweets;
        console.log(listOfTweets[k]);                               
    });
    console.log(listOfTweets[k]);
}
Run Code Online (Sandbox Code Playgroud)

Run*_* FS 6

getJSON执行异步,最后一个console.log用于在赋值之前执行

因为我不知道你真正想要的是很难告诉你应该做什么.您需要记住的是执行顺序.

在这段代码中

 $.getJSON(searchURL, function(tweets){
          console.log("done");
    });
    console.log("Request send");
Run Code Online (Sandbox Code Playgroud)

发生的第一件事是发送请求searchURL然后接下来的事情是"请求发送"将被打印到控制台,当浏览器收到对请求的响应时,该函数将立即被调用并且"完成"将打印到控制台

进一步你的代码有关闭的问题,因为k被关闭并且对于所有回调的调用将具有相同的值(1)

要解决这个问题,你可以使用自执行功能

for(var k = 0;k<10;k++){
    $.getJSON(searchURL, (function(i){
          return function(tweets){  
                         console.log("done for " + i);
                 }
     }(k));
    console.log("Request send for " + k);
 }
Run Code Online (Sandbox Code Playgroud)

注意k被立即用作函数的参数,参数的值被存储以供函数return作为回调引用,并且当k递增时不会改变.如果你这样做,那么因为所有的回调都引用了同一个对象,所以它们对k都具有相同的值

(1)除非一些在循环结束前返回