/ / ¿Cómo funcionan dos funciones diferentes con el mismo nombre de variable? - javascript, función, node.js

¿Cómo funcionan dos funciones diferentes con el mismo nombre de variable? - javascript, función, node.js

Esto es de nodo-trabajador web en node.js. El código funciona como se anuncia, pero no entiendo cómo.

En master.js se crea el trabajador web (como w), y tiene w.onmessage = function.... Pero en foo.js que definió el trabajador web, ya existe una onmessage = function....

Me falta algo fundamental, pero la pregunta es: ¿por qué no master.js w.onmessage sobrescribir el original foo.js onmessage?

master.js

var sys = require("sys");
var Worker = require("webworker");

var w = new Worker("foo.js");

w.onmessage = function(e) {
sys.debug("Received mesage: " + sys.inspect(e));
w.terminate();
};

w.postMessage({ foo : "bar" });

foo / foo.js

var sys = require("sys");
onmessage = function(e) {
postMessage({ test : "this is a test" });
};

onclose = function() {
sys.debug("Worker shutting down.");
};

Respuestas

0 para la respuesta № 1

Si tienes un módulo con código como este:

func = function() {
console.log("function called");
};

Y así lo requieren:

var module=require("./module");

Entonces module.func estarán undefined. Eso es porque func se asigna al alcance global del módulo. Cuando llame require, obtienes una referencia al módulo "s exports, no el módulo "s globales. Por lo tanto, cuando se establece module.func, digamos, así:

module.func = function() {
console.log("was it overwritten?");
};

... entonces el módulo "s exports reflejará la nueva función, pero nunca tocó los indicadores globales del módulo.


0 para la respuesta № 2

Porque cuando realiza cambios en la instancia del objeto, no cambia su prototipo (clase) (lea sobre el modelo de objeto js). Si desea cambiar el comportamiento del objeto principal, escriba esto:

w.prototype.onmessage = function() {/* ...your code... */};

JS Object Model le permite sobrescribir el método de cada objeto para cambiar su comportamiento, pero prototipo seguro de este cambio. Acostumbrarse.

Cuando carga el módulo, se ejecuta en un ámbito aislado, por lo que no puede obtener acceso a las funciones de sys sin el objeto de cambio directo requerido. Eso le ayudará a comprender el modelo del módulo nodejs ", intente ejecutarlo:

require.js

module.exports = {};

main.js

var x = require("./require.js");
x.tell = true;
var y = require("./require.js");
y.tell = false;

console.log(require("./require.js"));