何が起こっているのかを理解するには、実際に行われたことを非常によく見なければなりません。
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
をローカルスコープに入れて、さらに展開することもできます。どのようにa
とb
に関する
あなたの質問に今
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
が最初に一致した "カッコで囲まれたサブダッチ"です。
['String.replace'のドキュメント(https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/String/replace#Specifying_a_function_as_a_parameter)はそれに答える必要があります。 – DCoder
これらはltおよびgtですか? – Darek
自己実行機能をすばやく見つけたら何が起こるのか分かりやすくしてください。そうでなければ、 'String.de'が返された関数のコードを表示しない理由が不思議に思います。 – clentfort