Как работают две разные функции с одинаковым именем переменной? - PullRequest
0 голосов
/ 20 августа 2011

Это от node-webworker в node.js. Код работает как рекламируется, но я не понимаю, как.

В master.js веб-работник создан (как w) и имеет w.onmessage = function.... Но в foo.js, который определил веб-работника, уже есть onmessage = function....

Я упускаю что-то фундаментальное, но вопрос в том, почему master.js w.onmessage не перезаписывает оригинал 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.');
};

Ответы [ 2 ]

0 голосов
/ 21 августа 2011

Потому что, когда вы вносите изменения в экземпляр объекта, вы не меняете его прототип (класс) (читайте об объектной модели js).Если вы хотите изменить поведение родительского объекта, введите:

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

Модель объектов JS позволяет перезаписать метод каждого объекта, чтобы изменить его поведение, но при этом защитить прототип от этого изменения.Привыкайте.

Когда вы загружаете модуль, он работает в изолированной области, поэтому вы не можете получить доступ к функциям sys без непосредственного изменения требуемого объекта.Это поможет вам понять модель модуля nodejs, попробуйте запустить ее:

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'));
0 голосов
/ 20 августа 2011

Если у вас есть модуль с таким кодом:

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

И требует это так:

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

Тогда module.func будет undefined. Это потому, что func назначено глобальной области видимости модуля. Когда вы звоните require, вы получаете ссылку на exports модуля, а не на глобальные модуля . Таким образом, когда вы устанавливаете module.func, скажем так:

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

... тогда exports модуля действительно будет отражать новую функцию, но он никогда не затрагивал глобальные значения модуля.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...