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

为何自定义trace函数未按预期执行?调用o.sq(5)仅输出25

问题:trace函数未触发日志输出的原因分析

执行以下代码后仅输出25,未触发trace函数添加的进入、退出日志打印,预期输出应为:

当前日期时间 Entering: 方法名
当前日期时间 Exiting: 方法名
25

相关代码

let o = {
        x : 1, 
        y : 2, 
        z : 3,
    };

o.sq = function(n){ 
        return n*n; 
   };

function trace(o, m) {  // taken from David Flanagan page-187
 var original = o[m];

 o[m] = function() { 
            console.log(new Date(), "Entering:", m);
            var result = original.apply(this, arguments);
            console.log(new Date(), "Exiting:", m); 
            return result; 
        };
}

trace(o, o.sq);
console.log(o.sq(5));

错误原因

核心问题是调用trace时传参错误:

  • 调用trace(o, o.sq)时,第二个参数传递的是o.sq对应的函数对象,而不是方法名的字符串"sq"。
  • 在trace函数中,o[m]会把函数对象作为键,给o新增一个属性(而非覆盖原有的o.sq),原有的平方函数完全没被修改。所以调用o.sq(5)时,执行的还是最初定义的未包装版本,自然不会打印日志。

修正方法

将trace的调用改为传递方法名字符串:

trace(o, "sq");

修改后,trace函数会通过字符串键"sq"找到o.sq对应的原函数,替换为包装后的函数。此时调用o.sq(5)就会触发日志打印,最终输出符合预期。

内容的提问来源于stack exchange,提问作者Goutam Debnath

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 01:28:15