持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第11天,点击查看活动详情
前言
上一章写到了,this的几种绑定方式,那么它的绑定规则你们都清楚吗,我们这一章就来深入的学习一下
this绑定规则的优先级
学习了四条规则,接下来开发中我们只需要去查找函数的调用应用了哪条规则即可,但是如果一个函数调用位置应用了多条规则,优先级谁更高呢?
默认规则的优先级最低
毫无疑问,默认规则的优先级是最低的,因为存在其他规则时,就会通过其他规则的方式来绑定this的
显示绑定优先级高于隐式绑定
举个栗子
我们拿call函数来测试
function foo () {
console.log(this)
}
## new绑定优先级高于bind
var obj = {
name: 'kaka',
fn: foo
}
obj.fn.call('777')
代码的执行结果如下
new绑定优先级高于隐式绑定
我们直接来上代码测试
举个栗子
var obj = {
name:'kaka',
foo: function () {
console.log(this)
}
}
var foo = new obj.foo()
上述代码如果是隐式大于new的话,应该是打印出来obj对象,但如果是new大于隐式的话,打印出来的应该是引擎帮我们生成的那个foo对象
我们来看下结果
new绑定优先级高于bind
new绑定和call、apply是不允许同时使用的,所以不存在谁的优先级更高口new绑定可以和bind一起使用,new绑定优先级更高
举个栗子
我们来看下代码测试吧
function foo () {
console.log(this)
}
var bar = foo.bind('111')
var obj = new bar()
如果bind大于new应该打印string,但现实并不是这样的,来看结果,还是new的绑定大于bind的
this的规则之外,忽略显示绑定
平时我们绝大多数开发都符合上述规则,但有些特定的情况
就是apply,call和bind,如果传入this是null或者undefined的时候,它会指向全局对象,我们一起来看看
function foo () {
console.log(this)
}
foo.apply('111')
foo.apply({})
foo.apply(null)
foo.apply(undefined)
如结果所示,前边this的指向更改如我们所想,后边的就是说的特殊情况,指向window对象