Javascript jQuery函数中的作用域

Javascript jQuery函数中的作用域,javascript,jquery,json,Javascript,Jquery,Json,我不明白为什么在第一个console.log下面的代码中显示了对象,而第二个未定义。如何解决此问题 var listOfTweets = []; for(var k = 0; k < search.length; k++){ $.getJSON(searchURL, function(tweets){ listOfTweets[k] = tweets; console.log(listOf

我不明白为什么在第一个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]);
}

getJSON是异步执行的,最后一个console.log是在分配之前执行的

因为我不知道你到底想要什么,所以很难告诉你应该做什么。你需要记住的是执行顺序

在此代码中

 $.getJSON(searchURL, function(tweets){
          console.log("done");
    });
    console.log("Request send");
发生的第一件事是将请求发送到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);
 }
请注意,k立即用作函数的参数,该参数的值作为回调存储以供函数返回时引用,并且在k递增时不会更改。如果您这样做,那么由于所有回调都引用同一个对象,因此它们的k值也将相同


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

,否则所有的$.getJSON调用都是异步进行的。您的最后一个console.log可能是在任何getJSON调用完成之前被调用的。

尝试按如下方式保存k:

var listOfTweets = [];

for(var k = 0; k < search.length; k++){
    $.getJSON(searchURL, function(tweets){    
        var kk = k; // saved!!                          
        listOfTweets[kk] = tweets;
        console.log(listOfTweets[kk]);                               
    });
    console.log(listOfTweets[k]);
}

因此,当k增加时,它不会影响您保存的kk。您需要一个闭包来将k的当前值保存到回调的作用域中。否则,k等于执行回调时循环后的search.length。另外,请参阅,了解何时可以使用填充的文档列表


您是否也注意到k在所有回调函数中都有相同的值,这只是为了演示我如何无法访问内部的相同数据。getJSON.Scope与jQuery无关没有jQuery函数。jQuery是一个JavaScript函数,不是一种有自己构造的语言,它只是一个聪明的JS…只是在回调函数中保存k没有效果。
var listOfTweets = [];
var search = [url1, url2, ...];

$.each(search, function(k, searchURL) {
    $.getJSON(searchURL, function(tweets){                              
        console.log(listOfTweets[k] = tweets);         
    });
});

// After all the ajax request completed, you will be able to
console.log(listOfTweets);