【书名】:你不知道的JavaScript(上卷)
【作者】:Kyle Simpson
【本书总页码】:213
【已读页码】:110
1. 隐式绑定和显式绑定优先级比较
可以看到,显式绑定优先级更高,也就是说在判断时应当先考虑是否可以应用显式绑定。
再来看一下,new 绑定和隐式绑定
new 绑定比隐式绑定优先级高,那么 new 绑定和显式绑定谁的优先级更高呢?
new 和 call/apply 无法一起使用,因此无法通过 new foo.call(obj1) 来直接进行测试。但是可以使用硬绑定来测试它俩的优先级。
bar 被硬绑定到 obj1 上,new bar(3) 并没有将obj1.a修改为3。new 只是修改了硬绑定(到 obj1 的)调用 bar(..) 中的 this。因为使用了new 绑定,我们得到了一个名字为 baz 的新对象,并且 baz.a 的值是 3。
现在可以按照下面的顺序来进行this绑定的判断:
1. 函数是否在new中调用(new绑定)?如果是的话this绑定的是新创建的对象。
var bar = new foo()
2. 函数是否通过call、apply(显式绑定)或者硬绑定调用?如果是的话,this绑定的是指定的对象。
var bar = foo.call(obj2)
3. 函数是否在某个上下文对象中调用(隐式绑定)?如果是的话,this 绑定的是那个上下文对象。
var bar = obj1.foo()
4. 如果都不是的话,使用默认绑定。如果在严格模式下,就绑定到undefined,否则绑定到全局对象。
var bar = foo()
网友评论