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

Javascript Nodejs:在函数调用中包装整个脚本,javascript,node.js,Javascript,Node.js,我一直在nodejs中编写模块,如下所示: module.exports = function (logger, db, external,constants) { return { //something } } 最近,我的团队中有人建议将整个脚本包装在一个函数中,以避免变量的全局混淆,例如: (function () { 'use strict'; module.exports = function (log

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

module.exports = function (logger, db, external,constants) {

        return {
           //something

        }
    }
最近,我的团队中有人建议将整个脚本包装在一个函数中,以避免变量的全局混淆,例如:

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

        return {
               //something
        }
    }

}());
我知道这种做法通常用于客户端代码。但在nodejs的服务器端,这是必需的吗?我认为在nodejs中实际上没有全局作用域,只有module.exports才是真正可以访问的,而不管我们在脚本文件中写了什么(当然不要在这里发疯)。

不,Node.js不需要

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

但是,Node.js执行的每个模块/文件都有一个“模块范围”,类似于IIFE提供的范围:

在浏览器中,顶级作用域是全局作用域。这意味着,在浏览器中,如果您在全局范围
var中,则会定义一个全局变量在节点中,这是不同的。顶层范围不是全局范围<代码>变量节点模块内的某些内容将是该模块的本地内容。

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

foo = 'bar'; // lack of `var` defines a global

console.log(global.foo); // 'bar'

你实际上已经在这么做了

他建议将整个脚本封装在如下函数中:

function () {

}
就这些。没什么特别的。当然,在常规javascript中,函数定义只是定义一个函数,函数中的代码不会运行。因此,要自动运行函数,请将其包装在表达式上下文中并调用它:

(function () {

})()
但是,在node.js中,您不需要这样做。相反,您可以在需要模块时简单地调用该函数。因此,在node.js中,这在创建私有作用域方面做了完全相同的事情:

module.exports = function () {

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


这可能是我第一次看到命名事物和设计模式的危害。在这种情况下,你的朋友在思考生活。但是生活没有什么特别的。iLife不会创建私有范围。是函数创建了作用域。iLife只是函数调用自身的一种方式。这就是为什么我更喜欢叫它self-calling函数,以避免给它一种神奇的感觉,这种感觉可能会让一些人觉得它很特别。

没有理由。默认情况下,节点模块在自己的范围内执行。因此,我应该避免创建没有var的变量,但iLife根本不是必需的。当我看到他的示例时,这是我的第一个想法:他已经在函数中包装了他的模块。