JavaScript中this指向由调用方式决定:1.new绑定指向新对象;2.显式绑定(call/apply/bind)优先级最高;3.隐式绑定指向调用它的对象;4.默认绑定非严格模式为window、严格模式为undefined;箭头函数无this,继承外层词法作用域。
JavaScript中this的指向不是看函数怎么定义,而是看它**怎么被调用**。核心原则就一条:谁调用,this就指向谁(箭头函数除外)。下面按优先级从高到低说清楚最常见的4种绑定规则。
当函数通过 new 调用时,无论函数内部怎么写,this 都指向由 new 创建的那个新对象。
this
this 上this
例如:
function Person(name) {这三个方法可以手动把 this 绑定到任意对象上,优先级高于隐式绑定和默认绑定。
func.call(obj, a, b):立即执行,this 是 obj
func.apply(obj, [a, b]):同上,参数以数组传入const fn = func.bind(obj):返回一个新函数,this 永远是 obj
注意:bind 多次调用只生效第一次,后续的 bind 不会覆盖原始绑定。
这是最常见也最容易出错的情况:函数作为对象的属性被调用(即“点”出来的)。
obj.foo() → this 是 obj
const fn = obj.foo; fn();,就丢失了隐式绑定,退回到默认绑定(非严格模式下是 window,严格模式下是 undefined)obj.inner.method() 中 this 是 inner,不是 obj
既没 new、也没显式绑定、也没隐式调用,就走默认绑定。
this 指向全局对象(浏览器里是 window)this 是 undefined
this 始终是 undefined(模块自动启用严格模式)箭头函数不遵循以上任何规则——它没有自己的 this,而是沿用外层普通函数作用域的 this 值(词法绑定),所以不能用 call/apply/bind 改变它的 this。
基本上就这些。记牢调用方式决定 this,而不是定义方式,再结合优先级顺序判断,就不会乱了。