节点模块外的JS函数的范围

时间:2015-08-04 21:09:25

标签: node.js

我知道在Node中,如果你在module.exports之外定义了变量,那么它仍然在本地意味着它不会对全局命名空间进行规范。它不公开。什么是公共的是你的模块中定义的内容。

然而功能呢?它们的行为与变量相同吗?生活在module.exports之外的函数名是否会发生碰撞?

示例:

myFirst.js

var iAmStillPrivate = "private";

module.exports = {
...whatever code I wanna expose through this module
}

function find(somethingId)
{

    ..some code
};

mySecond.js

var iAmStillPrivate = "private";

module.exports = {
...whatever code
}

function find(somethingId)
{

    ..some code
};

执行find()冲突并污染全局命名空间吗?

我应该这样做吗?:

mySecond.js

var iAmStillPrivate = "private";

module.exports = {
     find: find(id)
...whatever code
}

var find = function find(somethingId)
{

    ..some code
};

或者将它扔进变量并不重要?好的做法?真的不重要吗?

结论

mySecond.js (我是母亲的模块。我创建了一个隐式匿名函数,当我在其他.js文件中'需要'时将其包装在这里< / p>

`var iAmStillPrivate = "private";` (no I'm scoped to the module, the root anonymous function that is...)

(module.exports - 我允许这些东西是公开的。当我在节点中说公共时,那是......公共的,因为这里的东西可以被其他.js文件中的其他模块访问。 )

module.exports = {
...whatever code 
}

(我仍然是一个作用于模块的函数但是我没有被导出所以我没有其他模块可用,我只属于模块(根匿名函数)

function find(somethingId) 
{

    ..some code
};

1 个答案:

答案 0 :(得分:4)

NodeJ的每个模块中的函数对于该模块是本地的,并且不与具有相同名称的其他模块的函数冲突。 想想它就像模块被包装在一个函数中一样。

另外,你真的不需要为你的函数定义一个变量,因为最后它并不重要,这两行的函数和变量的范围是相同的,并且是模块的本地变量: / p>

var find = function find(somethingId) ...

function find(somethingId) ...

附带问题

同样在你的评论中你问过这个场景:

  

如果我在全局范围内有一个函数,并且模块也有一个具有相同名称的私有函数,该怎么办?他们发生冲突吗?

在模块内部,对该函数的任何调用都会触发local函数而不是global函数。一旦您在该模块之外或在另一个模块内,任何对该函数的调用都将触发global函数。

让我们以一个例子来看待它。假设我们的Node应用程序起始点为index.js,其内容为:

echo('one');

require('./include.js')

echo('three');

function echo(txt){
  console.log("we are in index.js", txt);
}

这是一个名为include.js的模块:

echo('two');

function echo(txt){
  console.log("we are in include.js", txt);
}

如果使用node index.js命令运行此应用程序,则输出应为:

we are in index.js one
we are in include.js two
we are in index.js three

请参阅?正如我之前解释的那样,所有功能都在那里工作。