无法获得内部箭头函数

时间:2018-01-26 19:14:14

标签: javascript

当我意识到它没有按预期工作时,我正在制作一个装饰函数以响应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




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。这些函数表达式最适合非方法   函数,它们不能用作构造函数。

Source