función dinámica reescritura puede ser utilizado como una forma de lazy initialization, sin embargo, hay un inconveniente:
function Foo() {...}
Foo.prototype = {
bar: function() {
//some initialized variables to close over
var a, b, c, ...;
Foo.prototype.bar = function() {
//do stuff with variables
};
Foo.prototype.bar.call(this);
}
};
Aunque este código es relativamente sencillo de entender, y se utilizaría como:
var f = new Foo();
f.bar(); //initializes `bar` function
f.bar(); //uses initialized `bar` function
tiene un problema oculto:
var f = new Foo(),
g = {};
//passing by reference before the function was initialized will behave poorly
g.bar = f.bar;
f.bar(); //initializes `bar` function
g.bar(); //re-initializes `bar` function
f.bar(); //uses initialized `bar` function
g.bar(); //re-initializes `bar` function
Es por esta razón que cualquier inicialización necesaria para una función se realiza normalmente usando un patrón módulo:
function Foo() {...}
Foo.prototype = {
bar: (function() {
var a, b, c, ..., fn;
//some initialized variables to close over
fn = function() {
//do stuff with variables
};
return fn;
}())
};
El patrón módulo tiene la desventaja de llamar a la código de inicialización de inmediato, pero no tendrá los problemas asociados con la referencia de función.
¿Por qué habría una condición de carrera? No hay múltiples subprocesos simultáneos ejecutando el JavaScript. – mellamokb
Oh duh. Gracias :) – Alan