在JavaScript中访问外部作用域

时间:2011-07-13 03:22:53

标签: javascript scope

所以我在这里有这个JS代码,我试图从成功和错误回调中设置obj,但显然toLinkInfo函数范围不是那些的父范围?无论怎样,我总是从这个函数中恢复。我尝试了很多东西,但无法让它工作,我想我已经习惯了C&朋友:)我怎么能让这个工作?

LinkInfoGrabber.prototype.toLinkInfo = function() {
    var obj = null;
    $.ajax({
        url: this.getRequestUrl(),
        success: function(raw) {
            obj = new LinkInfo(raw);
        },
        error: function(jqXHR, textStatus, errorThrown) {
            obj = new LinkInfoException(jqXHR, textStatus, errorThrown);
        },
        dataType: 'html'
    });

    if (obj instanceof LinkInfo) {
        return obj;
    } else {
        throw obj;
    }
}

3 个答案:

答案 0 :(得分:3)

此代码:

if (obj instanceof LinkInfo) {
        return obj;
    } else {
        throw obj;
    }
在启动ajax调用后,

立即运行,但在ajax调用成功完成之前,不会设置obj。这是一种常见的误解。 Ajax调用是异步的。您对$ .ajax()的调用启动异步调用,然后立即执行函数的其余部分。仅当ajax调用成功(稍后)时才调用成功处理程序。你不能从你的函数返回obj。您必须在成功处理程序中处理obj,然后再调用想要从成功处理程序中使用它的任何内容。

答案 1 :(得分:3)

这是因为AJAX调用是异步的 - 它们发生在与其他上下文不同的时间。

尝试给它一个回调函数(下面称为回调函数)。

LinkInfoGrabber.prototype.toLinkInfo = function(callback) {
    $.ajax({
        url: this.getRequestUrl(),
        success: function(raw) {
            callback( new LinkInfo(raw) );
        },
        error: function(jqXHR, textStatus, errorThrown) {
            obj = new LinkInfoException(jqXHR, textStatus, errorThrown);
        },
        dataType: 'html'
    });
}

var l = new LinkInfoGrabber()
l.toLinkInfo(console.log) //replace console.log with something meaningful

虽然这种方法不能提供与内联调用内容完全相同的结果,但它具有允许Web异步性的好处。

答案 2 :(得分:0)

在调用obj之前返回ajax,因此在返回时它不会设置为null。