2016-03-28 6 views
2

На данный момент моя функция sum выглядит как код ниже. Он работает и возвращает сумму последовательных вызовов. Но как я могу сделать эту работу без пустой скобки в конце? Пример theSum(5)(4)(3), который возвращается 12.Как я могу заставить эту функцию javascript называть себя?

function theSum(x) { 
    var total = x; 

    function rec(y) { 
     if (y === undefined) return total; 
     total += y; 
     return rec; 
    }; 

    return rec; 
} 

console.log(theSum(5)(4)(3)()); // 12 
+2

Вы можете использовать метод toString. Я не могу себе представить, где эта цепочка будет полезна:? –

+1

Не совсем понятно, что вы пытаетесь достичь, помимо очевидного. Но почему цепь, я не понимаю. Мой оригинальный ответ решил эту проблему по-другому, но вы не нашли ее полезной. Поэтому будьте более кратки, чем вы хотите это сделать. как говорит @php_nub_qq. «Я не могу себе представить, где это может быть полезно». Итак, дайте нам знать, какой он вам полезен. И почему для вас важнее значение Sum (5) (4) (3), чем theSum (5) (4) (3)() или Sum ([5,4,3])? Или это вопрос о домашнем задании, и вы даже не уверены в том, что youirself – KyleK

ответ

1

Вот предложение, используя метод ToString:

function theSum(x) { 
    var total = x; 

    function rec(y) { 
     total += y; 
     return rec; 
    }; 

    rec.toString = function() { return total; } 

    return rec; 
} 

alert(theSum(5)(4)(3)); 

console.log(parseInt(theSum(5)(4)(3))); 

Однако обратите внимание, что вам нужно преобразовать возвращаемую ссылку на строку, в некотором роде, так что вы видите результат.

+0

Это возвращает '{[Функция: rec] toString: [Function]}' в NodeJS –

+0

@stack_pooper да, это то, что он возвращает, преобразовывая его в строку где происходит волшебство. Хорошее имя кстати. –

1

Это невозможно. Функция не может вернуть функцию и целое число. Вы можете сделать theSum(5, 4, 3) = 12 или theSum([5, 4, 3]) = 12.

0

Затворы и JavaScript утиной типизации на помощь:

function NumSumFun(initial){ 
    function NumSumNext(num) { 
      initial+= num; 
     return NumSumNext; 
    } 
    NumSumNext.valueOf = function() { return initial; } 
    return NumSumNext; 
} 

var x = NumSumFun(10)(29); // ==> function 39 
x + 1; // ==> 40 

Так случается. Он возвращает функцию, но функция имеет свойство valueOf, которое имеет доступ к накопленному значению, поэтому функция действует как число при использовании в качестве числа.