1.this的默认绑定
凡是函数作为独立函数调用,无论它的位置在哪里,它的行为表现,都和直接在全局环境中调用一样。(即默认绑定window)
2.this的隐式绑定
当函数被一个对象“包含”的时候,我们称函数的this被隐式绑定到这个对象里面了,这时候,通过this可以直接访问所绑定的对象里面的其他属性。
1.在隐式绑定中,如果函数调用位置是在一串对象属性链中,this绑定的是最内层的对象。
2.当函数引用有上下文对象时,隐式绑定规则会把函数调用中的this绑定到这个上下文对象。
this的隐式绑定所存在的this绑定丢失的问题,也就是对于 “ fireInGrobal = obj.fire”。(引用函数本身,不带有函数对象的上下文,即隐式丢失问题)
fireInGrobal调用和obj.fire调用的结果是不同的,因为这个函数赋值的过程无法把fire所绑定的this也传递过去。这个时候,
3.this的显式绑定:(call和bind方法)
call的基本使用方式: fn.call(object) (apply与call基本类似,不多说)
fn是你调用的函数,object参数是你希望函数的this所绑定的对象。
fn.call(object)的作用:
1.即刻调用这个函数(fn)
2.调用这个函数的时候函数的this指向object对象
call和bind的区别是:在绑定this到对象参数的同时:
1.call将立即执行该函数
2.bind不执行函数,只返回一个可供执行的函数
在隐式绑定下:函数和只是暂时住在“包含对象“的旅馆里面,可能过几天就又到另一家旅馆住了
在显式绑定下:函数将取得在“包含对象“里的永久居住权,一直都会”住在这里“
4.new绑定
执行new操作的时候,将创建一个新的对象,并且将构造函数的this指向所创建的新对象
1 2 3 4 5 6 7 8 9 10 11 |
|
this绑定规则
- new > 显示绑定 > 隐式绑定 > 默认绑定
注意:
箭头函数:不使用这四个this规则,根据词法作用域来决定this。