JavaScript中(0, x.f)与(x.f)为何表现不同?
为什么
(x.f)()和(0,x.f)()的this绑定不同? 先看示例代码:
x={f(){return this}} x.f() //x (x.f)() //x (0,x.f)() //window
我了解到分组运算符(())不会对内部表达式调用GetValue,而逗号(,)或逻辑或(||)等运算符则会。这是否意味着(x.f)和(0,x.f)在内存中是两个不同的对象,因此它们的this会绑定到不同的对象?不过我尝试了以下几种方式比较函数本身(而非返回值),结果均显示相等。这些方法无法真正比较内存地址,所以我不确定它们是否为同一对象:
(x.f)==(0,x.f) //true (x.f)===(0,x.f) //true Object.is((x.f),(0,x.f)) //true
核心结论:函数对象是同一个,差异源于this绑定规则
(x.f)和(0,x.f)指向的是同一个函数对象,所有相等性判断返回true已经能证明这一点——JavaScript中引用类型的全等判断就是基于内存地址的,只要指向同一地址就会返回true,不存在“无法比较内存地址”的问题。
两者调用时this不同,本质是调用语境的差异:
x.f()和(x.f)():分组运算符仅改变表达式优先级,不会破坏x.f的“属性访问”语境。此时函数是作为x的方法被调用,属于方法调用模式,this自动绑定到所属对象x。(0,x.f)():逗号运算符会触发GetValue操作,x.f被求值为函数本身(脱离了原对象x的上下文),此时属于普通独立函数调用,非严格模式下this会绑定到全局对象window。
简言之:同一个函数,以“对象方法”的身份调用和以“独立函数”的身份调用,this的绑定规则完全不同,这才是导致结果差异的原因。
内容的提问来源于stack exchange,提问作者Cutie Florent
相关产品推荐
相关产品推荐

