2012-10-27 7 views
5

JavaScritのモジュール例をテストしています。私は誰がaとbを関数(a、b)で渡すのか分からない。どういうわけか、それは動作します。関数(a、b)の値は何ですか?

Function.prototype.method = function(name, f) { 
    this.prototype[name] = f; 
    return this; 
} 
String.method('de', function() { 
    var entity = { 
     lt : '<', 
     gt : '>' 
    }; 
    return function() { 
     return this.replace(/&([^&;]+);/g, function(a, b) { 
      document.write("<br> a=" + a + " b=" + b); 
      var r = entity[b]; 
      return typeof r === 'string' ? r : a; 
     }); 
    }; 
}()); 
document.write("<br>" + '&lt;&gt'.de()); 
+4

['String.replace'のドキュメント(https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/String/replace#Specifying_a_function_as_a_parameter)はそれに答える必要があります。 – DCoder

+0

これらはltおよびgtですか? – Darek

+0

自己実行機能をすばやく見つけたら何が起こるのか分かりやすくしてください。そうでなければ、 'String.de'が返された関数のコードを表示しない理由が不思議に思います。 – clentfort

答えて

1

何が起こっているのかを理解するには、実際に行われたことを非常によく見なければなりません。

Function.prototype.method = function(name, f) { 
    this.prototype[name] = f; 
    return this; 
} 

この部分はかなり明確で、どのオブジェクトのプロトタイプを拡張するための「ショートカット」です。

魔法はコードの第2部分で起こります。以前に定義された関数は、第2パラメータとして自己実行関数を備えています! 「第一の内側」機能を割り当てる前に実行されるため

String.method('de', function() { 
    var entity = { 
     lt : '<', 
     gt : '>' 
    }; 
    return function() { 
     return this.replace(/&([^&;]+);/g, function(a, b) { 
      // "this" will refer to the object the function is bound to. 
      document.write("<br> a=" + a + " b=" + b); 
      var r = entity[b]; 
      return typeof r === 'string' ? r : a; 
     }); 
    }; 
}()); <-- The magic happens here! 

この手段は、JavaScriptインタプリタは、実際の関数として「第一の内側」関数(直接String.methodに供給されるもの)の戻り値を使用しますString.prototype

以下のコードは同じですが、もう1つの変数(de)をローカルスコープに配置しています。上記のアプローチはスコープを汚染しませんが、これを達成するよりエレガントな方法です。 entityをローカルスコープに入れて、さらに展開することもできます。どのようにabに関する

あなたの質問に今
var de = function() { 
    var entity = { 
     lt : '<', 
     gt : '>' 
    }; 
    return function() { 
     return this.replace(/&([^&;]+);/g, function(a, b) { 
      // "this" will refer to the object the function is bound to. 
      document.write("<br> a=" + a + " b=" + b); 
      var r = entity[b]; 
      return typeof r === 'string' ? r : a; 
     }); 
    }; 
}; 
String.method('de', de()); 

は遊びに来て! これは、2番目のパラメータが渡されたときの動作を、関数String.replaceがどのように動作させるかに関係します。コメントに記載されているlink DCoderはこれを非常にうまく説明しています!パラメータaは完全一致部分文字列で、bが最初に一致した "カッコで囲まれたサブダッチ"です。

+0

はい、これは素晴らしい答えです。どうもありがとうございました! –

+0

@JAnyありがとう、これを答えとして受け入れてもらえますか? (答えの点数の下にある緑色のチェックマークをクリックしてください)また、良い質問ですが、何が起こっていたのか把握するのに時間がかかりました。 – clentfort

関連する問題