具有相同变量名的两个不同函数如何工作?

时间:2011-08-20 08:03:00

标签: javascript function node.js

这是来自node.js中的node-webworker。代码按照宣传的方式工作,但我不明白如何。

master.js中创建了Web工作者(作为w),它具有w.onmessage = function...。 但是在定义了Web工作者的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.js

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

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

2 个答案:

答案 0 :(得分:0)

如果您的模块包含如下代码:

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

并且需要这样:

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

然后module.func将是undefined。那是因为func被分配给模块的全局范围。当您致电require时,您会获得对模块 exports 的引用,而不是模块的 globals 。因此,当你设置module.func时,比如说:

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

...然后模块的exports确实会反映新函数,但它从未触及模块的全局变量。

答案 1 :(得分:0)

因为当您在对象实例中进行更改时,您不会更改其原型(类)(阅读有关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'));