在JavaScript中关闭 - 什么是错的?

Shk*_*riy 0 javascript closures

我尝试使用闭包进行下一步:

function func(number) {
    var result = number;

    var res = function(num) {
        return result + num;
    };
    return res;
}

var result = func(2)(3)(4)(5)(3);
console.log(result); // 17
Run Code Online (Sandbox Code Playgroud)

我需要收到2 + 3 + 4 + 5 + 3 = 17但我收到一个错误:未捕获TypeError:数字不是函数

SLa*_*aks 8

你在滥用你的功能.

func(2)返回res函数.
调用该函数(3)返回数字5(via return result + num).

5不是一个函数,所以(4)给出一个错误.


Ber*_*rgi 8

你不知何故必须发出链的末尾信号,你要返回结果号而不是另一个函数.你有选择:

  • 让它返回一个固定次数的函数 - 这是使用语法的唯一方法,就像你拥有它一样,但它很无聊.看看@PaulS的回答.您可能使第一次调用(func(n))为多少参数的个数sum令行禁止.
  • 在某些情况下返回结果,比如在没有参数的情况下调用函数(@PaulS'第二个实现)或使用特殊值(null在@ AmoghTalpallikar的答案中).
  • 在函数对象上创建一个返回值的方法.valueOf()很适合,因为当函数转换为原始值时将调用它.看到它的实际效果:

    function func(x) {
        function ret(y) {
            return func(x+y);
        }
        ret.valueOf = function() {
            return x;
        };
        return ret;
    }
    
    func(2) // Function
    func(2).valueOf() // 2
    func(2)(3) // Function
    func(2)(3).valueOf() // 5
    func(2)(3)(4)(5)(3) // Function
    func(2)(3)(4)(5)(3)+0 // 17
    
    Run Code Online (Sandbox Code Playgroud)