私は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です。
私は、「明示的に最初に」または「暗黙的に最初に」を選択するかどうかを判断する論理的な方法はないと考えていました。それは「大会」です。
より明確になることを願っています。
個人的に私はカイルの「優先」という言葉の使用は意味がありません。順序や選択には関係ありません。 – Pointy
私はあなたを誤解しているかもしれませんが、ポイントは 'obj1.foo.call(obj2)'は 'obj2.tmp = obj.foo; obj2.tmp() 'したがって、 'this'は' obj1'ではなく 'obj2'になります。 – ruakh
私は、より高い「優先順位」によって、 'call(thisArg)'を使うとき、 'thisArg'が' obj.foo() 'を暗黙的にバインドした' this'よりも優先されることを意味します。 。 – Li357