Javascript数组范围 - 新手在这里

时间:2010-03-21 16:05:26

标签: javascript arrays gdata-api

所以,我在玩白色Google Calendar API的时候正在学习Javascript,我只是无法弄清楚这段代码是如何运作的:

var entriesResult = [];
var data = new Date(2010,3,22,17,0,0);
var callback = function(result) {       
    var entries = result.feed.getEntries();    
    if (entries.length != 0) {
        entriesResult = eventsManager(entries, 0, data);
        window.alert("inner entriesResult " + entriesResult.length);
    }
}
this.service.getEventsFeed(this.query, callback, handleGDError);
window.alert("outer entriesResult " + entriesResult.length);

eventsManager()是一个返回Objects数组的函数。

getEventsFeed()它是一个API函数:它查询服务并将“feed root”(包含所选项的feed)传递给回调函数。

为什么第一个警报(内部..)输出有效的entriesResult.length而第二个警告(外部..)总是输出0?

我认为javascript数组总是通过引用传递,我的代码有什么问题? 谢谢:))

2 个答案:

答案 0 :(得分:3)

getEventsFeed函数进行异步AJAX调用,并在服务器回复时调用callback。换句话说,回调函数在其余代码之后运行一段时间。

因此,当数组仍为空时,外部alert在回调之前执行。

修改

要从AJAX调用返回值,您需要接受回调作为参数,然后在有值返回后调用回调。

例如:

function myFunction(someParam, callback) {
    //Do things...
    var eventsFeedCallback = function() { 
        //Do more things, and figure out what to return
        callback(someValue);  //Call the user's original callback to give back a value
    };
    this.service.getEventsFeed(this.query, eventsFeedCallback , handleGDError);  
    //Do more things...
}

您可以像调用getEventsFeed一样调用此功能 例如:

myFunction("Parameter!", function(value) {
    //This is the callback, and will be called when the AJAX call finishes
    //Do things with value
});

答案 1 :(得分:1)

该行:

 window.alert("outer entriesResult " + entriesResult.length); 
启动异步操作(完成之前)后,

立即执行

在异步操作完成后,稍后执行回调函数中的行。