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()labelsconsole.log(labels)yo

4

2 に答える 2

2

関数 (「$.resx」関数) では、「ラベル」が参照するものと同じものを参照するように「結果」を設定します。ただし、「$.get()」からのコールバックでは、「yo」に設定します。その文字列定数「yo」は「labels」とは異なる値であり、実際には最初から何にも初期化されていません。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]);
});
于 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 に答える