为何自定义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
相关产品推荐
相关产品推荐

