2016-04-13 28 views
0
function sum(a) { 
     var sum = a 
     function f(b) { 
      sum += b 
      return f 
     } 

     f.toString = function() { return sum } 
     return f 
    } 
    var a = sum(0)(1)(2)(3)(4)(5); 

このコードはどのように動作するのですか?私は本当にそのような方法で複数のクロージャを持つ関数を呼び出す方法を取得しません。 と私はブラウザで印刷するとき、なぜその結果をコンソールには、「機能15」であるだけではなく、複数のクロージャを使用したjavascript関数の呼び出し

+0

あなたはどのような部分を理解していませんか? – SLaks

+0

ここにはクロージャーが1つしかありません。 – SLaks

+0

(0) - 1閉鎖(1)-2閉鎖など? –

答えて

2

15と私はブラウザで印刷するとき、なぜその結果をコンソールには、「機能15」であるだけではなく、15

最終結果を得るには、toStringと呼ぶべきです。このクロージャは、toString関数が呼び出されるまで合計を保持します。

function sum(a) { 
 
    var sum = a 
 

 
    function f(b) { 
 
     sum += b 
 
     return f 
 
    } 
 

 
    f.toString = function() { 
 
     return sum; 
 
    } 
 
    return f 
 
} 
 

 
var a = sum(0)(1)(2)(3)(4)(5); 
 

 
document.write(a.toString());

2

sum(0)ローカル変数sum(そのコードにのみ閉鎖)にわたって閉じ関数fを返します。関数を返すので、関数を呼び出すこともできます。この関数は引数を受け取り、自身を返します。これは、そのような連鎖を維持する方法です。

sum(0) // `sum` is 0, returns f (a function) 
sum(0)(1) // returns f which adds 1 to `sum` and returns f again 
// and again etc 

はそれについて考えて別の方法:

var fn0 = sum(0) // `sum` is 0, returns f (a function) 
var fn1 = fn0(1) // returns f which adds 1 to `sum` and returns f again 
var fn2 = fn1(2) // ...