JS对象中MethodB调用MethodA失效原因及相关ECMA标准说明
Object = { MethodA() { console.log('A') }, MethodB() { this.MethodA() } }
问题成因
核心为调用MethodB时的this绑定对象不正确:
- 方法内的
this指向不是由方法定义位置决定的,而是由方法的调用方式决定。如果调用MethodB时没有将调用上下文绑定到上述自定义的Object对象上,this就会指向其他值:- 非严格模式下独立调用
MethodB时,this指向全局对象,全局对象不存在MethodA属性,调用不存在的方法会抛出未捕获的类型错误,自然不会执行MethodA内的打印逻辑 - 严格模式下独立调用
MethodB时,this为undefined,直接调用undefined.MethodA()也会抛出未捕获的类型错误,导致逻辑中断
- 非严格模式下独立调用
- 额外说明:将自定义变量命名为
Object会覆盖全局原生Object构造函数,属于不规范写法,但不是该问题的核心诱因。
涉及技术术语
- This 绑定(This Binding)
- 隐式绑定丢失
- 函数执行上下文
- 严格模式
ECMA标准查阅位置
对应ECMA-262标准的可执行代码与执行上下文章节下的this决议相关规则,现行标准中对应第13章的13.2(函数对象)、13.3(This值决议)小节,不同版本标准的小节序号可能存在小幅差异,检索This Binding Resolution相关内容即可。
内容的提问来源于stack exchange,提问作者Greg Iven
相关产品推荐
相关产品推荐

