当我意识到它没有按预期工作时,我正在制作一个装饰函数以响应this question。该函数只计算调用给定函数的次数,并记录它。
function countExecutions(fn) {
let count = 0;
return () => {
console.log("called",++count);
return fn.apply(this, arguments);;
}
}
var test = countExecutions((a,b) => a+b);
var x = test(1,2);
console.log(x); // (a,b) => a+bundefined

我意识到这是因为arguments
引用了函数countExecutions
的参数而不是我的内部匿名函数。 因此它会记录(a,b) => a+bundefined
而不是3
。为什么我无法获得内部匿名函数的参数?
如果我给它起一个名字,它按预期工作:
function countExecutions(fn) {
let count = 0;
return function inner() {
console.log("called",++count);
return fn.apply(this, arguments);;
}
}
var test = countExecutions((a,b) => a+b);
var x = test(1,2);
console.log(x); // 3

答案 0 :(得分:2)
我认为您误解了箭头功能,这里是您的匿名(不使用箭头功能)版本:
(或者您可以使用@trincot's answer中所述的箭头功能。)
function countExecutions(fn) {
let count = 0;
return function(){
console.log("called",++count);
return fn.apply(this, arguments);;
}
}
var test = countExecutions((a,b) => a+b);
var x = test(1,2);
console.log(x); // (a,b) => a+bundefined

答案 1 :(得分:2)
如上所述,arguments
未定义箭头功能。但为什么不使用扩展语法:
function countExecutions(fn) {
let count = 0;
return (...args) => {
console.log("called",++count);
return fn.apply(this, args);
}
}
var test = countExecutions((a,b) => a+b);
var x = test(1,2);
console.log(x); // 3
答案 2 :(得分:1)
由于命名函数,它不会以这种方式运行,但是因为您正在使用箭头函数。箭头函数不仅没有定义自己的函数范围,也没有arguments
:
箭头函数表达式的语法短于函数 表达式并没有自己的this,arguments,super或者 new.target。这些函数表达式最适合非方法 函数,它们不能用作构造函数。