jQuery Deferred Ajax,JavaScript范围问题?

时间:2011-02-16 19:35:48

标签: javascript jquery ajax jquery-deferred

我认为这很简单,但它不起作用(http://jsfiddle.net/QtjaG/的实例):

$.resx = function() {
    var result = this;

    return $.get("/", function() {
        result = "yo";
    });
};

var labels;

$.resx.call(labels).then(function() {
    console.log(labels);
});

由于$.resx.call(labels)应将this内容设置为$.resx()labels,因此console.log(labels)不应该yo

2 个答案:

答案 0 :(得分:2)

在函数(“$ .resx”函数)中,您设置“result”以引用“labels”所指的相同内容。但是,在“$ .get()”的回调中,您将其设置为“yo”。字符串常量“yo”是不同的值而不是“标签”,实际上它并没有初始化为任何东西。在JavaScript中没有办法让引用引用;如果“标签”被定义为具有某些价值:

var labels = "this is a string";

然后“结果”最终会成为对该字符串的另一个引用。但是,字符串是不可变的,因此从“$ .get()”成功处理程序内部无法更改该字符串。

试试这个:

$.resx = function() {
    var result = this;

    return $.get("/", function() {
        result[0] = "yo";
    });
};

var labels = ["not yo"];

$.resx.call(labels).then(function() {
    console.log(labels[0]);
});

答案 1 :(得分:0)

如果你是console.log(这个),你会得到一个窗口。那是因为你的函数范围是全局的。我认为您正在寻找的是“应用”方法:https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/function/apply。但是我不认为你需要它,因为你可以在下面简单地做。 callBack函数的闭包将围绕“labels”引用。因为函数是一等对象,你可以直接作为委托传递它们并像callBack(x)一样调用它们;

$.resx = function(callBack) {      
    return $.get("/", function() {       
        callBack("yo");
    });  
};

var labels;

$.resx(function(response){
    labels = response;  
});