详细讲解JavaScript中的this绑定(3)

我们可以看到,在(1)处,bar函数内部的this原本指向的是obj1,但是在(2)处,由于经过了new操作符调用,bar函数内部的this却重新指向了返回的实例,这就可以说明new 绑定的优先级是要高于显式绑定的。
至此,四种绑定规则的优先级排序就已经得出了,分别是

new 绑定 > 显式绑定 > 隐式绑定 > 默认绑定

箭头函数中的this绑定

箭头函数是ES6里一个重要的特性。
箭头函数的this是根据外层的(函数或者全局)作用域来决定的。函数体内的this对象指的是定义时所在的对象,而不是之前介绍的调用时绑定的对象。举一个例子

var a = 1 var foo = () => { console.log(this.a) // 定义在全局对象中,因此this绑定在全局作用域 } var obj = { a: 2 } foo() // 1 ,在全局对象中调用 foo.call(obj) // 1,显示绑定,由obj对象来调用,但根本不影响结果

从上面这个例子看出,箭头函数的 this 强制性的绑定在了箭头函数定义时所在的作用域,而且无法通过显示绑定,如apply,call方法来修改。在来看下面这个例子

// 定义一个构造函数 function Person(name,age) { this.name = name this.age = age this.speak = function (){ console.log(this.name) // 普通函数(非箭头函数),this绑定在调用时的作用域 } this.bornYear = () => { // 本文写于2016年,因此new Date().getFullYear()得到的是2016 // 箭头函数,this绑定在实例内部 console.log(new Date().getFullYear() - this.age) } } } var zxt = new Person("zxt",22) zxt.speak() // "zxt" zxt.bornYear() // 1994 // 到这里应该大家应该都没什么问题 var xiaoMing = { name: "xiaoming", age: 18 // 小明永远18岁 } zxt.speak.call(xiaoMing) // "xiaoming" this绑定的是xiaoMing这个对象 zxt.bornYear.call(xiaoMing) // 1994 而不是 1998,这是因为this永远绑定的是zxt这个实例

因此 ES6 的箭头函数并不会使用四条标准的绑定规则,而是根据当前的词法作用域来决定 this ,具体来说就是,箭头函数会继承 外层函数调用的this绑定 ,而无论外层函数的this绑定到哪里。

小结

以上就是javascript中所有this绑定的情况,在es6之前,前面所说的四种绑定规则可以涵盖任何的函数调用情况,es6标准实施以后,对于函数的扩展新增了箭头函数,与之前不同的是,箭头函数的作用域位于箭头函数定义时所在的作用域。

而对于之前的四种绑定规则来说,掌握每种规则的调用条件就能很好的理解this到底是绑定在了哪个作用域。

您可能感兴趣的文章:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wzjyyw.html