¿Cuáles son los valores de la function (a, b)?

Estoy probando el ejemplo del module de JavaScrit: The Good Parts. No sé quién pasa en ayb en function (a, b). De alguna manera funciona

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()); 

One Solution collect form web for “¿Cuáles son los valores de la function (a, b)?”

Para entender lo que está sucediendo, uno tiene que observar muy de cerca lo que realmente se hace.

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

Esta parte es bastante clara, es un "atajo" para extender el Prototipo de cualquier object.

¡La magia ocurre en la segunda parte de tu código, la function previamente definida se suministra con una function autoejecutable como segundo parámetro!

 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! 

Esto significa que el intérprete de JavaScript usará el valor de retorno de la function "primera interna" (la que se suministró directamente a String.method ) como la function real, ya que la function "primera interna" se ejecuta antes de asignarla al String.prototype .

El código siguiente hace lo mismo pero pone una variable más ( de ) en el ámbito local. El enfoque anterior no contamina el scope, es una forma más elegante de lograr esto. Incluso podría desenvolverlo poniendo entity en el ámbito local.

 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()); 

¡Ahora a tu pregunta sobre cómo a y b entran en juego! Esto está relacionado con cómo se comporta String.replace cuando el segundo parámetro pasado es una function. El enlace DCoder proporcionado en los comentarios explica esto bastante bien. El parámetro a es la subcadena completa apareada, b es la primera sub-coincidencia entre paréntesis emparejada.

Javascript tiene muchos buenos JS marco (como Node.js AngularJS Vue.js React.js) es el mejor lenguaje de script.