为对象方法添加try-catch包装后返回值失效问题排查
你的函数包装后丢失返回值的原因及修复方案
嘿,我一眼就看出问题出在哪儿了——你写的trycatch包装函数没有返回原方法的执行结果!
原rambo.create方法本来会返回传入的参数i,但经过包装后,try代码块里只执行了myfunction.apply(this, arguments),却没把这个执行结果return出去。JavaScript里函数如果没有显式return,默认会返回undefined,这就是为啥你调用rambo.create(1)得不到预期的1。
修复后的代码
function trycatch(myfunction, name) { return function() { try { // 关键:返回原函数的执行结果 return myfunction.apply(this, arguments); } catch (e) { console.log(e + name); } }; } var rambo = { create: function(i, j) { return i }, ramv: function() { alert("") } // 这里你原来写的aler是笔误,改成alert啦 }; for (var key in rambo) { if (typeof rambo[key] === 'function') { rambo[key] = trycatch(rambo[key], key); } } console.log(rambo.create(1)) // 现在会输出1啦! // 测试异常捕获:rambo.ramv() 会打印错误信息+方法名
核心修改点
在try代码块里,把原函数的调用结果直接return出去。这样既保留了异常捕获的功能,又不会丢失原方法的返回值。另外我还顺手把你ramv方法里的aler改成了alert,不然这个笔误也会导致报错哦😉
内容的提问来源于stack exchange,提问作者Edwin Thomas
相关产品推荐
相关产品推荐

