2

我认为这很简单,但它不起作用(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吗?

4

2 回答 2

2

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

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]);
});
于 2011-02-16T19:43:47.127 回答
0

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

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

var labels;

$.resx(function(response){
    labels = response;  
});
于 2011-02-16T19:56:58.317 回答