this 的绑定规则:
(1)默认绑定:
- 独立函数调用:可以理解成函数没有被绑定到某个对象上进行调用 ->返回 window
(2)隐式绑定:object.fn()
- 是通过某个对象进行调用的,也就是它的调用位置中,是通过某个对象发起的函数调用 -> 返回对象
(3)显示绑定:
-
call/apply显示绑定:
-
call和apply在执行函数时,是可以明确的绑定this, 这个绑定规则称之为显示绑定
-
call/apply是可以指定this的绑定对象
-
apply为数组,call为参数列表
-
bind显示绑定:当我们希望一个函数总是显示绑定到一个对象上:
- bind方法通过传入一个对象,返回一个 this 绑定了传入对象的新函数
var newFoo = foo.bind("aaa")
- 默认绑定和显示绑定bind冲突: 优先级(显示绑定)
(4)new绑定:通过一个new关键字调用一个函数时(构造器), 这个时候this是在调用这个构造器时创建出来的对象,this = 创建出来的对象
- 创建一个全新的对象
- 这个新对象会被执行prototype连接
- 这个新对象会绑定到函数调用的this上(this的绑定在这个步骤完成)
- 如果函数没有返回其他对象,表达式会返回这个新对象;
this绑定规则的优先级:
(1)默认规则的优先级最低
(2)显示绑定优先级高于隐式绑定
(3)new绑定优先级高于隐式绑定
(4)new绑定优先级高于bind
① new绑定和call、apply是不允许同时使用的,所以不存在谁的优先级更高
② new绑定可以和bind一起使用,new绑定优先级更高
(5)new绑定的优先级最高