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

时间:2014-09-28 09:28:31

标签: javascript node.js

我一直在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是可访问的,无论我们在脚本文件中编写什么(当然不要在这里疯狂)。

2 个答案:

答案 0 :(得分:11)

不,Node.js不需要IIFE

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

但是,Node.js执行的每个模块/文件都有一个"模块范围,"类似于IIFE提供的范围,as described under "Globals"

  

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

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

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

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

答案 1 :(得分:1)

你实际上已经这样做了。

他的建议是将整个脚本包装在这样的函数中:

function () {

}

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

(function () {

})()

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

module.exports = function () {

}

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

这可能是我看到命名事物和设计模式的危害的第一个案例。在这种情况下,你的朋友正在考虑IIFE。但是IIFE并不特别。 IIFE不会创建私人范围。它是创造范围的功能。 IIFE只是函数调用自身的一种手段。这就是为什么我更喜欢称之为自我调用功能,以避免给它一种魔力感,这可能会让一些人认为它是一种特殊的东西。