我正在阅读一篇关于包装函数的文章,并且遇到了这个示例,它展示了如何包装函数以确定其性能。
function profile(func, funcName) {
return function () {
var start = new Date(),
returnVal = func.apply(this, arguments),
end = new Date(),
duration = stop.getTime() - start.getTime();
console.log(`${funcName} took ${duration} ms to execute`);
return returnVal;
};
}
var profiledMax = profile(Math.max, 'Math.max');
profiledMax.call(Math, 1, 2);
// => "Math.max took 2 ms to execute"
我因为这些问题而感到困惑:
returnVal = func.apply(this, arguments),
和
return returnVal;
我调查它的方式,当你调用profile(Math.max ...)时,它将返回一个匿名函数,那么为什么用参数调用匿名函数呢?我本以为你需要返回然后调用那个匿名函数来访问returnVal,这也是一个函数?像这样:
var profiledMax = profile(Math.max, 'Math.max');
var moreProfiledMax = profiledMax();
moreProfiledMax.call(Math, 1,2)
答案 0 :(得分:1)
returnVal
不是函数,而是调用func
的结果。 apply
方法将执行该方法,而bind
将返回一个函数。
答案 1 :(得分:1)
好吧,这很简单,首先你有这个函数包装另一个函数
function profile(func, funcName) {
return function () {
var start = new Date()**;**
returnVal = func.apply(this, arguments)**;**
end = new Date()**;**
duration = stop.getTime() - start.getTime();
console.log(`${funcName} took ${duration} ms to execute`);
return returnVal;
};
}
这一行:
var profiledMax = profile(Math.max, 'Math.max');
执行outter函数传递它将保存在outter函数定义的内部函数范围内的参数。最后返回内部函数,就好像你有:
var profiledMax = function () {
var start = new Date();
returnVal = **Math.max**.apply(this, arguments);
end = new Date();
duration = stop.getTime() - start.getTime();
console.log(`${funcName} took ${duration} ms to execute`);
return returnVal;
}
然后这一行:
profiledMax.call(Math, 1, 2);
执行profiledMax
传递2个参数(您可以将参数传递给JS中的任何函数)并将this
关键字绑定到Math对象,就像执行此函数一样:
function () {
var start = new Date(),
returnVal = Math.max.apply(**Math**, arguments),
end = new Date(),
duration = stop.getTime() - start.getTime();
console.log(`${funcName} took ${duration} ms to execute`);
return returnVal;
};
提案的问题在于:var moreProfiledMax = profiledMax();
returnVal = func.apply(this, arguments);
会中断,因为范围内不存在func。