Javascript jQuery函数中的作用域
我不明白为什么在第一个console.log下面的代码中显示了对象,而第二个未定义。如何解决此问题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
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);