我正在尝试使用js& amp; jquery但是我不能让它工作。
根据我的理解,当我声明一个没有var的变量时,它变为全局但我可以将一个变量从jquery回调传递给我的main函数。
function fetchEvents(start,end){
ret = [];
$j.getJSON("index.php?page=agenda_google_ajax&action=list&start="+start+"&end="+end,function(data){
console.log(data); // works ok
ret = data;
});
console.log(ret); // equals [] :'(
return ret;
}
答案 0 :(得分:2)
据我所知,当我用var声明变量时,它变成了全局..
反之亦然。省略var
时,变量变为全局变量。始终使用var!
来自Google JavaScript Style Guide:
如果你没有指定var,那么 变量放在全局中 背景,潜在的破坏 现有价值观。另外,如果没有 声明,很难说清楚 一个变量的范围(例如,它可以 就像在文档或窗口中一样 很容易在本地范围内)。所以 总是用var。
声明
关于console.log(ret); // equals [] :'(
的问题......
$j.getJSON()
不是同步方法调用。该方法以异步方式运行,因此您的代码有效地说:
ret = [];
console.log(ret);
如果你需要在执行后使用getJSON()返回的数据,你可以在回调函数中调用一个方法:
$j.getJSON("index.php?page=agenda_google_ajax&action=list&start="+start+"&end="+end,
function(data){ // this is your callback function
console.log(data); // works ok
doSomething(data); // process the returned JSON
}
});
答案 1 :(得分:2)
你的问题是$ .getJSON使用了一个回调,所以当你的fetchEvents函数被调用时,它会在回调执行之前返回。
你想要做的是在回调中填充/做你想做的事情。
正如您所指出的,console.log在回调中正常工作
答案 2 :(得分:1)
好像你在这里混淆了两个问题。
首先,var
不会产生变量。反之亦然。省略var
将使变量成为全局变量。
第二个是getJSON
回调方法不同步执行。一旦http请求完成,它将执行。因此,在进行ret
调用后,不会期望getJSON
会立即设置为该值。
答案 3 :(得分:0)
尝试将var添加到var ret = [];
答案 4 :(得分:0)
将var添加到它不会使其成为全局,省略它使其全局,它将被添加到全局窗口对象。
答案 5 :(得分:0)
那是因为在得到ajax的回复之前会对ret进行评估。试试
function fetchEvents(start,end){
$j.getJSON("index.php?page=agenda_google_ajax&action=list&start="+start+"&end="+end,function(data){
console.log(data); // works ok
var ret = data
whatsRet (ret);
});
}
function whatsRet (ret) {
console.log(ret); // equals data :)
}
答案 6 :(得分:0)
您遇到的问题是编写异步代码。
当您调用getJSON
时,在getJSON
返回某些内容之前,不会调用内部函数。这意味着代码不再自上而下执行,即使getJSON
仍在获取数据,您的程序也会继续执行。
您应该提供callback
而不是return
:
var fetchEvents = function (start, end, callback) {
$j.getJSON("index.php?start="+start+"&end="+end, function (data) {
callback(data);
});
};
// Now you can use fetchEvents which will be asynchronous too
fetchEvents(0, 10, function (data) {
console.log(data);
})
您可以将fetchEvents
直接传递给callback
来简化getJSON
事件。
var fetchEvents = function (start, end, callback) {
$j.getJSON("index.php?start="+start+"&end="+end, callback);
};
PD:我简化了查询的可读性。