機能追加(){ // すべてのパラメータを格納するように設計された配列の最初の実行、定義 VAR _args = Array.prototype.slice.call(引数); // 関数内で宣言され、クロージャの特性_args収集されたすべてのパラメータ値および保存 するvar _adder = 関数(){ ; _args.push(...引数) 戻り_adderを; }; // 暗黙的な変換が最後に行ったときに、暗黙的な変換特性のtoStringを使用し、及び返された最終値を計算する _adder.toString = 関数(){ 戻り _args.reduce(関数(B){ 返す + B; }); } 戻り_adder; }
関数呼び出しを見てください
追加(1)(2)(3)。// 6 追加(1)(2)(3)(4)。// 10
理由:jsが、弱い型付けされた言語であります
例えば:
あります = 1 + '0'; // == '10'が 有する ; '1' - B = 1 // B == '0'を 有する C =(1 == '1')。// C ==真
上記のような文字列に変換フィールドの背面整数として、いくつかの暗黙的な変換である「1」。
同様にオブジェクト(機能もオブジェクトである)は、隠された変換の場合であろう。
例えば:
VAR OBJ = {} VARの RET = OBJ + '1' // [対象オブジェクト] 1
ここでは、オブジェクトが暗黙の変換時間は、このメソッドのtoStringを呼び出しますです、あなたはプロキシ方式場合は、このメソッドをオーバーライドすることができます
戻るインタビューの質問に、実際には()の結果_adder.toStringを返さ_adderメソッドの戻りを追加し、その書き換え後のtoString()、あなたは、このメソッドは暗黙的に_adder.toStringを呼び出して使用することができます。