为什么JavaScript中两种函数调用场景下this的指向不一致?
JavaScript 不同调用方式下 this 指向差异的原因
JavaScript 中普通函数的 this 指向并非在函数定义阶段确定,而是由函数运行时的调用方式动态决定,你遇到的两种场景对应了两种不同的 this 隐式绑定规则:
- 调用
obj.one()时:函数是作为对象的方法被触发,此时this会自动绑定到调用该方法的对象obj上。obj本身存在two方法,因此可以正常执行输出two。 - 调用
oneFunc()时:执行let oneFunc = obj.one这步操作时,你只是把obj.one对应的函数体引用赋值给了独立变量oneFunc,此时oneFunc和obj已经没有关联。直接调用独立的普通函数时,非严格模式下this会默认绑定到全局对象(浏览器端为window,Node.js 端为globalThis),全局对象上没有定义two方法,因此会抛出类型错误。
补充:如果在严格模式下执行
oneFunc(),独立调用的普通函数this会被赋值为undefined,报错信息会变为Cannot read properties of undefined (reading 'two')。
如果需要让独立调用的 oneFunc 也能正常访问到 obj 上的方法,可以通过 bind 显式绑定 this:
let oneFunc = obj.one.bind(obj); oneFunc(); // 正常输出 two
内容的提问来源于stack exchange,提问作者Lee Morgan
相关产品推荐
相关产品推荐

