2012-09-18 24 views
7

Según this node style guide, dando un nombre de cierres es una buena práctica:¿Los cierres con nombre contaminan el objeto global/window?

derecho

req.on('end', function onEnd() { 
    console.log('winning'); 
}); 

incorrecto

req.on('end', function() { 
    console.log('losing'); 
}); 

Sin embargo, estoy acostumbrado a pensando en el

function someName() { someStatements(); } 

... sintaxis como algo que crea una variable global, someName o window.someName para esa función. ¿Es esto realmente una buena práctica, o es una muy mala guía de estilo?

Respuesta

3

En Node.js, lo que describes no contamina el contexto global.

dado:

function someName() { someStatements(); } 

global.someName se definirá. sin embargo, la siguiente:

setTimeout(function someName() { someStatements(); }, 500); 

Will no establecer global.someName.

Parece ser solo una cuestión de estética. Probé esto con node.js v0.8.4, pero el mismo comportamiento debería estar presente en la mayoría de los navegadores modernos.

0

No puede acceder a la función anónima utilizando el nombre (si la función tiene nombre). Sería accesible dentro del cuerpo de la función. Entonces no contaminaría el objeto ventana.

req.on('end', function onEnd() { 
    console.log(onEnd); //function body 
}); 
console.log(onEnd); //ReferenceError: onEnd is not defined 
4

Aunque usted no tendrá este problema con el nodo:

expresiones de funciones con nombre se pinchados en Internet Explorer, y contaminarán el objeto de la ventana, como se explica aquí: http://kangax.github.com/nfe/ en "errores de JScript"

La (no tan) lo curioso es que se crean incluso dentro de los bloques condicionales que no se ejecutan, como en este ejemplo:

var f = function g() { 
    return 1; 
}; 
if (false) { 
    f = function g(){ 
    return 2; 
    }; 
} 
g(); // 2 

Esto ha creado un problema en una planta de producción que trabajé, donde jQuery pronto fue reemplazada por otra cosa (https://dev.plone.org/ticket/12583)

+1

Vale la pena señalar que este error también afecta a los guiones de escritorio escritos para Windows Script Host (suponiendo que estén escritos en JavaScript también conocido como "JScript" en lugar de VBScript), ya que WSH e IE utilizan el mismo intérprete. – ebohlman

+1

Supongo que esto está solucionado en IE 11 porque cuando intento ejecutar su script obtengo el error "g no está definido" – Nilzor

1

El nombre del cierre con nombre solo es accesible dentro de de este cierre, por lo que nunca debe contaminar el espacio de nombres global. Normalmente usaría el cierre con nombre para crear un cierre recursivo.