我一直在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是可访问的,无论我们在脚本文件中编写什么(当然不要在这里疯狂)。
答案 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只是函数调用自身的一种手段。这就是为什么我更喜欢称之为自我调用功能,以避免给它一种魔力感,这可能会让一些人认为它是一种特殊的东西。