カレー - 古典的な顔の質問

機能追加(){
     // すべてのパラメータを格納するように設計された配列の最初の実行、定義
    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を呼び出して使用することができます。

 

おすすめ

転載: www.cnblogs.com/hellolol/p/11086691.html
おすすめ