为什么对象中定义的函数与普通函数的this指向存在差异?
JavaScript普通函数this指向差异原因解答
你提到的this指向由调用位置决定的判断是正确的,两个函数调用结果不同,本质是触发了不同的this绑定规则:
1. c.func() 绑定逻辑
该调用走隐式绑定规则:
当函数作为对象的属性方法,通过对象.方法名()的形式被触发时,this会直接绑定到前缀的调用对象上,这里c.func()的调用发起方是对象c,因此函数内部的this指向c,this.name的取值就是c.name的值john。
注意:你之前误以为调用位置在window上下文所以this指向window是错误的,只要调用时函数被某个对象持有并作为方法触发,优先级更高的隐式绑定会覆盖默认的全局绑定。
2. data() 绑定逻辑
该调用走默认绑定规则:
当函数没有任何前置对象、作为独立函数直接调用时,非严格模式下this默认绑定到全局对象(浏览器环境为window,Node.js环境为globalThis),严格模式下this会绑定为undefined。
另外注意data函数内部的let name: "hh"属于代码笔误,即使修正为let name = "hh",它也只是函数作用域内的普通变量,和this绑定的对象没有任何关联,不会影响this.name的取值。如果全局作用域下没有声明name变量,this.name就会返回undefined,和前者的john结果不同。
核心绑定优先级总结
普通函数的this绑定优先级从高到低为:
- new绑定 > 显式绑定(call/apply/bind)> 隐式绑定 > 默认绑定
内容的提问来源于stack exchange,提问作者gANDALF
相关产品推荐
相关产品推荐

