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

6
我一直在使用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是真正可访问的,无论我们在脚本文件中写什么(当然不要过度使用)。


6
没有特别的原因。Node模块默认在它们自己的作用域中执行。 - Bergi
2个回答

12
不,Node.js不需要使用IIFE
对于可能在多个环境(UMD)中使用的任何脚本,它们可能会有用。
但是,由Node.js执行的每个模块/文件都被赋予“模块作用域”,类似于IIFE提供的作用域,如“全局变量”下所述

在浏览器中,顶层作用域是全局作用域。这意味着在浏览器中,如果您在全局作用域中,则var something将定义一个全局变量。 但在Node中情况不同。 顶级作用域不是全局作用域; Node模块中的var something将局部于该模块。

尽管如此,Node.js仍然有一个全局作用域。当一个模块创建一个全局变量时,它将可被同一进程使用的其他模块访问。
foo = 'bar'; // lack of `var` defines a global

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

1
所以我应该避免创建没有 var 的变量,但是 IIFE 并不是必需的。 - Sikorski

1
你实际上已经在做这件事。 他建议将整个脚本包装在这样的函数中:
function () {

}

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

(function () {

})()

然而,在node.js中你不需要这样做。相反,当你需要模块时,你只需调用函数即可。因此,在node.js中,以下操作会创建一个私有作用域:

module.exports = function () {

}

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

这可能是我第一次看到命名和设计模式带来负面影响的案例。在这种情况下,你的朋友正在考虑IIFE。但是IIFE并没有什么特别之处。它不会创建私有作用域。函数才能创建作用域。IIFE只是让函数调用自身的一种方式。这就是为什么我更喜欢称其为自调用函数,以避免给它带来某种神奇感,这可能会导致一些人将其视为特殊的东西。


当我看到他的示例时,我的第一个想法是:他已经将他的模块包装在一个函数中了。 - ken
有没有什么办法可以将第三方js(比如Google One Tap)嵌入我们的js,并作为脚本嵌入到HTML中? - Sudhir Kaushik
@SudhirKaushik 不是在javascript本身内部。这就是范围的全部意义-在任何语言中:封锁作用域外的代码访问作用域内的事物。当然,由于js只是文本,您始终可以下载js文件并将代码复制/粘贴到自己的HTML中。但这是访问代码,与访问变量函数不同。 - slebetman
所以基本上它是IIFE。但是像Google分析脚本这样的脚本如何进入我的IIFE并执行,还传递了一些客户端ID呢? 我已经做了什么吗?还没有,但我想先通过SO了解这个概念。 - Sudhir Kaushik
如果您读到了我的答案底部,我实际上说的是它只是IIFE,而IIFE并不特别 - 它只是一个函数。GA无法进入您的函数。相反,您从函数内部调用GA函数。至于GA如何从您的代码中获取数据,您在调用GA函数时将其传递给了GA。 GA“自动魔法”地解析您的DOM以查找HTML中的一些相关元数据,并拦截用户事件,例如鼠标单击。 - slebetman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接