2016-10-24 22 views
1

私はKylie Simpsonの "this &オブジェクトプロトタイプ"を読んでいます。著者は明示的なバインディングが暗黙的なものよりも優先順位が高いと言います。明示的な 'this'バインディング優先順位と暗黙的 'this'バインディング優先順位

私は「obj1.fooは()」暗黙の結合であり、「obj1.foo(OBJ2)は、明示的な結合であることを理解しています。暗黙的に高い場合

しかし、私はどのように最後に理解していません2行は、その中で結果として、このような表現の

function foo() console.log(this.a); 
var obj1 = { a: 2, foo: foo }; 
var obj2 = { a: 3, foo: foo }; 

obj1.foo(); // 2 
obj2.foo(); // 3 
obj1.foo.call(obj2); // 3 
obj2.foo.call(obj1); // 2 

[OK]を、読み:?obj1.foo.call(OBJ2)、私は「これを」解決するには2つの方法があること、その本によると、と思いますが。
first:明示的なバインディングobj2はfooのコンテキストになるよう強制されます
2番目:暗黙のバインドing、obj1は "obj1 dot xxxxxx"内のドットに続く関数のコンテキストであり、その関数の "this"はobj1です。

私は、「明示的に最初に」または「暗黙的に最初に」を選択するかどうかを判断する論理的な方法はないと考えていました。それは「大会」です。
より明確になることを願っています。

+4

個人的に私はカイルの「優先」という言葉の使用は意味がありません。順序や選択には関係ありません。 – Pointy

+1

私はあなたを誤解しているかもしれませんが、ポイントは 'obj1.foo.call(obj2)'は 'obj2.tmp = obj.foo; obj2.tmp() 'したがって、 'this'は' obj1'ではなく 'obj2'になります。 – ruakh

+0

私は、より高い「優先順位」によって、 'call(thisArg)'を使うとき、 'thisArg'が' obj.foo() 'を暗黙的にバインドした' this'よりも優先されることを意味します。 。 – Li357

答えて

1

thisキーワードは、それぞれのオブジェクトのfooのネイティブcallメソッドを使用して、最後の2つの文でオーバーライドされます。 callに指定された最初のパラメータは、thisfooの範囲になるという参照です。 callの他の引数は、パラメータとしてfooに渡されたばかりです。したがって、callでは、バインドされた参照は実際に優先順位付けされるのではなく、むしろその関数呼び出しのために完全にに置き換えられます。それぞれ最後の2つのステートメントはまったく同じです:

obj2.foo(); 
obj1.foo(); 
+0

これは、 "明示的なバインディング"ルールを最初に評価して評価する場合です。 –

関連する問題