4

次のコードでは、最初の関数は にバインドされていませんobjが、2 番目の関数はバインドされているため、期待どおりにf()戻りfifig()戻りますMark Twain。しかし、3回目の試行では、最初に関数になり、次に呼び出されます。基本的にはケース(obj.getCallBack)と同じです。fただし、Mark Twain代わりに印刷されます。objを使用することにバインドされていないのに、 を指してbind()実行されるのはなぜですか? thisobj

(4 回目の試行はメソッドの通常の呼び出しでthisあり、メソッドが呼び出されるオブジェクトにバインドする必要があります)。

(現在の Chrome、Firefox、および IE 9 でテスト済み)

window.name = "fifi";

var obj = {
    name: "Mark Twain",
    getCallBack: function() {
        return this.name;
    }
}

var f = obj.getCallBack;
var g = f.bind(obj);

console.log(f);
console.log(f());

console.log(g);
console.log(g());

console.log((obj.getCallBack)());
console.log(obj.getCallBack());
4

2 に答える 2

4

関数が何らかのオブジェクトのプロパティとして呼び出された場合、そのオブジェクトがthis呼び出しの対象になることを忘れています。そう:

obj.getCallBack() //The function referenced by `obj.getCallBack`
                    //is called as a property of `obj`, so obj will be `this`
                    //for the call

f()    //The function referenced by f, is not called as a property of some object so
         //`this` will depend on strict mode.

.call/.applyこれらの基本的なルールの後、バインドされた関数が呼び出されます。これは、ターゲット関数のコンテキストを明示的に設定するために使用するプロキシ関数 (任意のシムがこれを行います) と考えることができます。したがって、thisプロキシ関数の値は問題ではありませんが、基本的なルールによって設定されていました。

編集:

(obj.getCallBack) getValue が呼び出されないため、関数を値として返しません。. obj.getCallbackしたがって、最初の投稿とまったく同じです。

したがって、これを実行してもエラーは発生しません。

(obj.getCallback) = 5;

とは対照的に:

(function(){}) = 5; //invalid assignment
于 2012-10-03T12:02:37.810 に答える
0

Esailja の答えを補完するために、実際に必要な効果は次のとおりです。

var obj = {
    name: "Mark Twain",
    getCallBack: function() {
        return function() { return this.name; };
    }
}

var f = obj.getCallBack();
var g = f.bind(obj);

console.log(f);
console.log(f());

console.log(g);
console.log(g());

console.log((obj.getCallBack())());
console.log(obj.getCallBack()());

console.log(obj.getCallBack().bind(obj)());

この場合、3 回目の試行で が得られfifi、4 回目の試行でも同様です。内部の名前を取得するためにobj、5 回目の試行でそれをバインドして呼び出し、取得しMark Twainます。

ただし、callBack 関数を返すメソッドはそれをバインドする必要があるため、コードを次のように変更しましょう。

var obj = {
    name: "Mark Twain",
    getCallBack: function() {
        return (function() { return this.name;}).bind(this);  // <-- note here
    }
}

そして今、すべての試行は、 であってもf()を返しMark Twainます。

于 2012-10-03T12:37:43.257 に答える