总体来说,this 总是指向离他最近的 function 关键字所属的对象。
可以分为严格模式下的和非严格模式下的;
严格模式下
函数调用时
1 | function foo() { |
此处的 this 为 undefined,因为 function 关键字所属的对象为 undefined,所以不能添加属性。
所有函数中,this 都是 undefined,包括函数内部的函数,如:
1 | function foo() { |
test()
函数的 this 依旧指向 undefined,与外层函数并无关系。
方法调用时
1 | function Foo() { |
方法调用时,Foo()
作为构造函数,对于obj
对象中的test
方法,其 function 关键字所属的对象为obj
对象,所以,会打印123
.
隐式调用
可以通过call
或apply
方法动态的改变 this 的指向;
1 | var obj = { bar: "123" }; |
函数绑定
可以通过bind()
方法绑定 this 值:
1 | function foo(name) { |
值得注意的是,bind()
返回的是一个新的函数.
箭头函数
箭头函数并没有function关键字,所以依旧找离他最近的function关键字,判断this指向.
1 | function Foo(name) { |
因为箭头函数最近的function关键字是Foo
函数,所以,this指向的是Foo
函数所属的对象,即undefined.
非严格模式
在非严格模式下,与严格模式不同的地方在于函数调用时this的绑定,非严格模式下,比如浏览器环境,则指window对象.