Nodejs:在函数调用中包装整个脚本

我一直在nodejs中编写模块,如下所示:

module.exports = function (logger, db, external,constants) { return { //something } } 

最近我的团队中有人build议整个脚本应该包含在一个函数中,以避免variables的全局混淆,例如:

 (function () { 'use strict'; module.exports = function (logger, db, external,constants) { return { //something } } }()); 

我明白这种做法通常用于客户端代码。 但是在服务器端在nodejs中是否需要这个? 我认为在nodejs中确实没有全局范围,只有module.exports才是真正可以访问的,而不pipe我们在脚本文件中写的是什么(当然这里不要这样)。

不,Node.js不需要IIFE 。

它们对于可能在多个环境( UMD )中使用的任何脚本都很有用。

但是,由Node.js执行的每个模块/文件都被赋予一个“模块范围”,类似于IIFE提供的范围, 如“Globals”中所述 :

在浏览器中,顶级范围是全局范围。 这意味着在浏览器中,如果你在全局范围内, var something将会定义一个全局variables。 在Node中,这是不同的。 顶级范围不是全球范围; 在Node模块内的var something将是该模块的本地内容。

尽pipe如此,Node.js仍然有一个全局的范围。 当一个模块创build一个全局的时候,它可以在同一个进程使用的其他模块中访问。

 foo = 'bar'; // lack of `var` defines a global console.log(global.foo); // 'bar' 

你其实已经在做这个

他所build议的是将整个脚本封装在如下的函数中:

 function () { } 

就这样。 没什么特别的。 当然,在常规的javascript中,函数定义只是定义了一个函数,函数内部的代码不会运行。 所以要自动运行你把它包装在expression式上下文中的函数并调用它:

 (function () { })() 

但是,在node.js中,您不需要这样做。 相反,您可以在需要模块时简单地调用该函数。 所以在node.js中,这在创build私有范围方面完全相同:

 module.exports = function () { } 

所以告诉你的朋友你已经在一个函数中包装了整个脚本。

这也许是我看到命名和devise模式受到伤害的第一个例子。 在这种情况下,你的朋友正在考虑IIFE。 但是IIFE没什么特别的。 IIFE不创build私人范围。 这是创build范围的function。 IIFE只是函数调用自身的手段。 这就是为什么我更喜欢把它称为自我调用function,以避免给它一种可能导致一些人认为它是特殊的魔法感。