开发者

How does two different functions with the same variable name work?

This is from node-webworker in node.js. The code works as advertised, but I don't understand how.

In master.js the web worker is created (as w), and it has w.onmessage = function.... But in foo.js which defined the web worker, there is already an onmessage = function....

I'm missing something fundamental, but the question is: why doesn't the master.js w.onmessage overwrite the 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 = f开发者_JAVA百科unction(e) {
    postMessage({ test : 'this is a test' });
};

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


If you have a module with code like this:

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

And require it like this:

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

Then module.func will be undefined. That's because func is assigned to the module's global scope. When you call require, you get a reference to the module's exports, not the module's globals. Thus, when you set module.func, say, like this:

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

...then the module's exports will indeed reflect the new function, but it never touched the module's globals.


Because when you make changes in instance of object you don't change his prototype (class) (read about js object model). If you want to change behavior of parent object then type this:

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

JS Object Model lets you to overwrite every object's method to change it's behavior but safe prototype from this change. Get used.

When you load module it runs in isolated scope, so you couldn't get access to sys functions without direct change required object. That will help you to understand nodejs' module model, try to run it:

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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜