JS函数中的this是在调用时被绑定的,this所绑定的对象取决于函数的调用位置
首先确定函数的调用位置,然后判断需要应用下面四条规则中的哪一条。
-
默认绑定
独立函数调用:function foo() { console.log( this.a ); } var a = 2; foo(); // 2
foo函数直接使用,不带任何修饰,此时,应用默认绑定规则,this指向全局对象。
· 注意如果是严格模式,this将会绑定到undefined,因为全局对象无法使用默认绑定。 -
隐式绑定
调用位置是否有上下文对象,或者说是否被某个对象所“拥有”或“包含“。function foo() { console.log( this.a ); } var obj = { a: 2, foo: foo }; obj.foo(); // 2
foo函数的调用位置使用obj上下文来引用函数。当函数引用有上下文对象时,隐式绑定会把函数调用中的this绑定到这个上下文对象。
-
显式绑定
通过call()、apply()、bind()方法直接指定this的绑定对象,这种方式称为显示绑定。function foo() { console.log( this.a ); } var obj = { a:2 }; foo.call( obj ); // 2
-
new绑定
使用new调用函数,会自动执行下面的操作:- 创建一个全新的对象
- 对新对象执行原型连接
- 将函数调用中的this绑定到该对象
- 如果函数没有返回其他对象,new表达式中的函数调用会自动返回这个新对象。
规则优先级
new绑定 > 显示绑定 > 隐式绑定 > 默认绑定