this绑定,在面试的时候被问到的频率几乎是百分之百。今天面试的时候,被问到了什么是显示绑定和隐式绑定(懵逼),还有解释各种不同绑定的问题,还有笔试题。所以弄懂this绑定特别重要。
this可以分为默认绑定,显示绑定,隐式绑定,new绑定,箭头函数绑定等。
1.默认绑定:
this默认绑定我们可以理解为函数调用时无任何调用前缀的情景,它无法应对我们后面要介绍的另外四种情况,所以称之为默认绑定,默认绑定时this指向全局对象(非严格模式):
2.隐式绑定:
什么是隐式绑定呢,如果函数调用时,前面存在调用它的对象,那么this就会隐式绑定到这个对象上。
如果函数调用前存在多个对象,this指向距离调用自己最近的对象
3.显示绑定:
显式绑定是指我们通过call、apply以及bind方法改变this的行为,相比隐式绑定,我们能清楚的感知 this 指向变化过程。
其中call, apply, bind的区别?
1.call、apply与bind都用于改变this绑定,但call、apply在改变this指向的同时还会执行函数,而bind在改变this后是返回一个全新的boundFunction绑定函数,
这也是为什么上方例子中bind后还加了一对括号 ()的原因。 2.bind属于硬绑定,返回的 boundFunction 的 this 指向无法再次通过bind、apply或 call 修改;call与apply的绑定只适用当前调用,调用完就没了,下次要用还得再次绑。 3.call与apply功能完全相同,唯一不同的是call方法传递函数调用形参是以散列形式,而apply方法的形参是一个数组。在传参的情况下,call的性能要高于apply,因为apply在执行时还要多一步解析数组。
4.new绑定
准确来说,js中的构造函数只是使用new 调用的普通函数,它并不是一个类,最终返回的对象也不是一个实例,只是为了便于理解习惯这么说罢了。
那么new一个函数究竟发生了什么呢,大致分为三步:
1.以构造器的prototype属性为原型,创建新对象; 2.将this(可以理解为上句创建的新对象)和调用参数传给构造器,执行; 3.如果构造器没有手动返回对象,则返回第一步创建的对象
5.箭头函数绑定
箭头函数中没有this,箭头函数的this指向取决于外层作用域中的this,外层作用域或函数的this指向谁,箭头函数中的this便指向谁。
还有一个特点:一旦箭头函数的this绑定成功,也无法被再次修改,有点硬绑定的意思。
this绑定的优先级:
我们先介绍前四种this绑定规则,那么问题来了,如果一个函数调用存在多种绑定方法,this最终指向谁呢?这里我们直接先上答案,this绑定优先级为: 显式绑定 > 隐式绑定 > 默认绑定 new绑定 > 隐式绑定 > 默认绑定
参考:https://www.cnblogs.com/echolun/p/11962610.html