前言
上一章我们说到,this绑定的四种规则,默认绑定,隐式绑定,显式绑定和new绑定,并且我们抛出了一个问题,如果当这几个绑定一起使用的时候,优先级又是怎样的,这一章我们将就这个问题进一步展开解释
正文
优先级
毫无疑问,默认绑定的优先级是四条规则中最低的,所以我们可以先不考虑它。我们先来比较一下隐式绑定和显式绑定的优先级,看一下下面的例子:
可以看到,显式绑定优先级更高,也就是说在判断时应当先考虑是否可以应用显式绑定。然后我们再看一下new绑定和隐式绑定的优先级谁更高
可以看到 new 绑定比隐式绑定优先级高。最后我们只需要比较一下new绑定和显式绑定就可以了,new 和 call/apply 无法一起使用,因此无法通过 new foo.call(obj1) 来直接进行测试。但是我们可以使用上一章说的硬绑定来测试它俩的优先级,也就是bind
不难看出,这里采用了new的this绑定,也就是new的this绑定优先级是在bind之前的,总结下来就是new绑定 > 显式绑定 > 隐式绑定 > 默认绑定,不过其实new的绑定优先级
从bind源码看为什么new绑定优先级更高
下面是 new 修改 this 的相关代码:
简单来说,这段代码会判断硬绑定函数是否是被 new 调用,如果是的话就会使用新创建的 this 替换硬绑定的 this。所以这也是为什么new绑定的优先级在bind之上
new绑定和显式绑定在函数柯里化的应用
那么,为什么要在 new 中使用硬绑定函数呢?直接使用普通函数不是更简单吗?之所以要在 new 中使用硬绑定函数,主要目的是预先设置函数的一些参数,这样在使用new 进行初始化时就可以只传入其余的参数。bind(…) 的功能之一就是可以把除了第一个参数(第一个参数用于绑定 this)之外的其他参数都传给下层的函数(这种技术称为“部分应用”,是“柯里化”的一种)。举例来说:
小结
这一章我们介绍了this相关绑定的优先级关系,并且从源码层面阐述了new绑定的优先级在显式绑定之前,但是既是规则,总有例外,下一章我们将进一步分析this绑定规则之外的一些例外情况,谢谢学习