2011-03-18 68 views
7

在我的server.js我包括下划线库。node.js需要继承吗?

var _ = require('underscore') 

我有我的路线是这样的:

// require routes 
require('./routes/document'); 

在文件路径,我想用下划线。但似乎_ var没有被继承/在文档范围内。这是否意味着我必须在每个必需路线上设置_ var?还是有更聪明的方法来做到这一点?

谢谢。

回答

6

是的,你应该在需要它可用的文件中设置_。

或者,您可以通过删除var部件将其放到全局范围中。

_ = require('underscore'); 
require('./routes/document'); // _ will be visible in document as well 
+6

如果您使用'global。_ = require(“underscore”);'那么意思就会变得更加明显,并且对于你是否忘记了'var'语句没有“怀疑”。 – Raynos 2011-04-09 19:19:00

+4

删除'var'会将它置于模块范围内而不是全局范围。 – Raynos 2011-06-22 08:46:51

+0

@Raynos“模块范围”是什么意思?这是否意味着只有该模块以及该模块需要的所有模块才能访问它? – MiniGod 2012-10-04 00:32:32

4

检查node.js模块文档,其中require()被彻底解释。

http://nodejs.org/docs/v0.4.5/api/modules.html

至于你的具体情况:

“模块是他们第一次加载后缓存,这意味着(除其他事项外)每次调用需要(‘富’)将得到完全返回相同的对象,如果它将解析为相同的文件。“

因此,如果您在父库和'./routes/document'中都需要('underscore'),则只会加载下划线模块的一个实例,因此,这两个vars实际上都是同一个对象。

顺便说一下,您不希望在全局范围中定义变量,因为它可能会产生副作用并可能覆盖其他模块中的属性。

最后,util的模块提供了一个继承方法子类另一个构造并从其继承原型。

http://nodejs.org/docs/v0.4.5/api/util.html#util.inherits

+0

'_'是一个通用的实用程序库。如果你使用,你可以在整个代码集中使用它。它用于“增强”JavaScript。我认为将它包含在全局中是有效的,否则我会在所有single_ node.js文件中“要求”它。在大多数情况下,是应该避免的。 – Raynos 2011-04-09 19:18:31

+2

@Raynos我明白这是一个通用库。无论所需模块如何,我的答案都是一般形式。不过,无论如何,我不会扩大全球范围。 :-) – pdeschen 2011-04-09 20:36:56

+0

你如何避免在你的所有文件中写入require(“global-common”);'' (假设你在每个文件中都包含了这样的内容) – Raynos 2011-04-09 20:47:30

1

据我所知Node.js的引擎“要求/费用”,在不同的范围模块/ file.js(我不知道究竟是如何),出于安全原因(想象一个模块可能会改变所需的变量,这将是危险的!,关于这个问题的更多信息http://en.wikipedia.org/wiki/Information_hiding)。

唯一的例外是暴露在模块范围内的全局对象http://nodejs.org/api/globals.html

一个全局对象,恰恰是客体“全球性”,和您定义的一切,而不var关键字居然被添加到全局对象:

foo_var =“不管”

意味着:

console.log(global.foo_var)//记录“无论”

+0

nope。检查https://nodejs.org/api/globals.html#globals_global – Tivie 2015-07-15 17:06:43

+0

@Tivie你不同意哪部分? “foo_var”实验完全按照所述进行工作。 – chris 2015-07-27 08:17:54

+0

对不起,我误解了你写的内容。 – Tivie 2015-07-27 13:08:35