《JavaScript权威指南》中call/apply调用未绑定对象方法报错咨询
问题核心原因
你混淆了call/apply的实际作用和「给对象挂载方法」的操作,两者本质完全不同。
具体错误拆解
benchmark.call(obj)仅做了一件事:临时将benchmark函数执行时内部的this指向obj,执行完成后没有任何残留修改。执行完这行代码后obj仍然是空对象,不会自动新增benchmark属性。- 你调用
trace(obj, "benchmark")时,函数内第一行let original = o[m]实际取的是obj.benchmark,此时该属性不存在,original的值为undefined。后续执行original.apply(this, args)时,自然会抛出“无法读取undefined的apply属性”的错误。 - 你把
call换成apply也无法解决问题,因为两者只有传参形式的差异,核心作用完全一致:仅临时修改函数调用时的this指向,不会修改传入的上下文对象本身。 - 只有
obj.benchmark = benchmark是真正给obj对象挂载了benchmark方法属性,此时trace函数内才能取到正确的原始函数,apply调用才会正常执行。
对《JavaScript权威指南》内容的补充说明
文中提到的「就好像它是某个其他对象的方法一样」,仅指代函数执行时的this表现和对象主动调用方法的this表现一致,不代表函数会被真正挂载到对象上。你可以用下面的代码验证差异:
const o = {}; function test() { console.log(this === o); // 验证调用时this指向 } test.call(o); // 输出 true,调用时this符合方法调用的表现 console.log(o.test); // 输出 undefined,对象o根本没有新增test属性
内容的提问来源于stack exchange,提问作者maxloo
相关产品推荐
相关产品推荐

