2011-09-11 9 views
6

más fácil de explicar con código:Módulos de nodo: ¿exportar una variable frente a las funciones de exportación que hacen referencia a ella?

##### module.js 
var count, incCount, setCount, showCount; 
count = 0; 

showCount = function() { 
return console.log(count); 
}; 
incCount = function() { 
    return count++; 
}; 
setCount = function(c) { 
    return count = c; 
}; 

exports.showCount = showCount; 
exports.incCount = incCount; 
exports.setCount = setCount; 
exports.count = count; // let's also export the count variable itself 

#### test.js 
var m; 
m = require("./module.js"); 
m.setCount(10); 
m.showCount(); // outputs 10 
m.incCount(); 
m.showCount(); // outputs 11 
console.log(m.count); // outputs 0 

Las funciones exportadas funcionan como se esperaba. Pero no me queda claro por qué m.count no es también 11.

Respuesta

13

exports.count = count

la configuración de una propiedad en un objeto countexports a ser el valor de count. Es decir. 0.

Todo es pasar por valor no pasar por referencia.

Si se va a definir count como un captador, como por ejemplo:

Object.defineProperty(exports, "count", { 
    get: function() { return count; } 
}); 

Entonces exports.count siempre devolvería el valor actual de count y por lo tanto ser de 11

+2

¡No todo es pasar por valor! Las funciones y los objetos siempre se pasan por referencia. – zetlen

+2

@zetlen no se pasan por valor. El valor que están pasando es una referencia a un objeto. Pase por referencia son punteros. No tenemos punteros – Raynos

0

me corrija si estoy equivocado, pero los números son tipos inmutables. Cuando cambie el valor de count, su referencia también cambiará. Por lo tanto, exports.count referencias al antiguo valor count.

0

En JavaScript, las funciones y los objetos (incluidas las matrices) se asignan a las variables por referencia, y las cadenas y los números se asignan por valor, es decir, haciendo una copia. Si var a = 1 y var b = a y b++, a aún será igual a 1.

En esta línea:

exports.count = count; // let's also export the count variable itself 

que hizo una copia por valor de la variable de recuento. Las operaciones setCount(), incCount() y showCount() operan todas en la variable de conteo dentro del cierre, por lo que m.count no se toca nuevamente. Si esas variables estuvieran operando en esta cuenta, obtendría el comportamiento esperado, pero probablemente no quiera exportar la variable de conteo de todos modos.

+0

"por referencia" implica punteros. ¿Dónde están estos indicadores que tenemos en javascript? – Raynos

+1

Bastante justo. ¿Qué usarías para describir la diferencia entre asignación de objeto/asignación de función y asignación de cadena? No, no es una ubicación de memoria literal, pero dos referencias a un objeto modificarán o mostrarán el mismo objeto, y eso no es cierto para una cadena. ¿Cómo llamas a eso? – zetlen

+1

@zetlen, este artículo responde de manera sucinta a su pregunta: https://developer.mozilla.org/en-US/docs/Talk:JavaScript/Guide/Obsolete_Pages/Defining_Functions. En esencia, todas las funciones de JavaScript pasan por valor. La pregunta interesante es: ¿qué valor pasan? Para los tipos primitivos, es el dato en sí mismo y para los tipos no primitivos, es el local de la entidad. – Thierry

Cuestiones relacionadas