我想知道在函数中定义函数是否是JavaScript中的一个好习惯。
以下是一个例子:
module.exports = function() {
function foo() {
// do something
}
...
foo()
...
}
对我来说,这看起来很奇怪。但是在阅读开源项目时我经常会看到这一点。
在上面的示例中,在foo
范围之外定义module.exports
是否更好?为什么不呢?
答案 0 :(得分:1)
在Javascript中,可以在全局范围或任何函数范围中定义函数。作为一般的良好设计实践,您希望将函数的范围限制为仅需要调用它的范围。这意味着您经常在其他函数中定义本地使用的函数。
此外,在另一个函数范围内声明的函数声明也可以访问该范围内的所有其他变量,这些变量非常有用。
这有很多一般好处:
它只将函数保持为需要使用它的作用域(除非将引用显式传递给作用域以外的其他函数或变量,否则不能从定义它的作用域之外调用它)
它可以防止您使用数以万计的命名函数来污染顶级作用域,其中一些甚至可能在一个非常大的项目中具有冲突的名称。在节点模块中,情况并非如此,因为节点模块已经是有限的范围。
它允许函数访问该范围内的其他变量。
那是“一般”的讨论。现在,在一个节点模块中,模块中的代码已经在私有范围内,因此在export函数中声明一个函数并不像你所做的那样重要,但我通常遵循仅在声明一个函数的做法它的使用范围。
此外,许多功能可以内联和匿名声明,甚至不需要名称。
在您的具体示例中:
module.exports = function() {
var cntr = 0;
function foo() {
// do something
}
...
foo()
...
}
这实际上取决于您使用foo
的内容。如果您从未在任何其他范围内使用它,那么我倾向于像您一样在该范围内声明它。
如果您需要或想要访问该范围内的其他变量,例如我显示的cntr
变量,则必须在范围内声明它。