何が起こっているのかを理解するには、実際に何が行われているのかをよく見る必要があります。
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インタープリターは、「firstinner」関数(に直接提供される関数)の戻り値をString.method
実際の関数として使用します。これは、「firstinner」関数がに割り当てられる前に実行されるためString.prototype
です。
de
以下のコードは同じことを行いますが、ローカルスコープにもう1つの変数( )を配置します。上記のアプローチはスコープを汚染しません。これを達成するためのよりエレガントな方法です。entity
ローカルスコープに入れてさらにラップを解除することもできます。
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());
a
さて、どのようにそして場に出るかについてのあなたの質問b
に!これはString.replace
、渡された2番目のパラメーターが関数である場合の動作に関連しています。コメントで提供されているリンクDCoderは、これをかなりよく説明しています。パラメータa
は、一致したサブストリング全体でb
あり、最初に一致した「括弧で囲まれたサブマッチ」です。