You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

《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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 14:54:04