我正在阅读Kylie Simpson撰写的“此&对象原型”。作者说,显式绑定的优先级高于隐式绑定。
我理解“obj1.foo()”是隐式绑定,而“obj1.foo(obj2)是显式绑定。
但是,如果隐含更高,我不明白最后两行是如何导致的?
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
好的,读到这样一个表达式:obj1.foo.call(obj2),我认为,根据那本书,有两种方法来解决“这个”。
第一:显式绑定。 obj2被迫成为foo的背景
第二:隐式绑定,obj1是“obj1 dot xxxxxx”中点后面的函数的上下文,该函数的“this”是obj1。
我的意思是,我认为没有合理的方法可以确定我们选择“先显式”还是“先隐式”。这是一个“惯例” 我希望它更清楚。
答案 0 :(得分:1)
this
关键字在最后两个语句中通过相应对象的call
的本地foo
方法被覆盖。为call
指定的第一个参数是this
将在foo
范围内的引用。不存在call
的其他参数只是作为参数传递给foo
。因此,对于call
,绑定引用不是真正的优先级,而是完全替换仅用于该函数调用。最后两个陈述分别与:
obj2.foo();
obj1.foo();