最近,我正在调试我的一个同事编写的一些代码,并在较大的函数内部的有条件的条件下找到了类似的东西。
(function(foo){
...
console.log(foo);
...
})();
所以看起来很精巧
function display(db, user, foo) {
if (isValid(db, user) {
(function(foo){
console.log(foo);
})();
}
...
}
最初它的末尾没有();
,所以据我所知甚至没有被调用,但更广泛的问题是,它与下面的东西有什么区别?我已经看过几次这种语法,但是我不明白上面的语法对这个目的有多大帮助。我的理解是,这只会增加不必要的复杂性。有人请赐教!
function display(db, user, foo) {
if (isValid(db, user) {
// without abstract function
console.log(foo);
}
...
}
谢谢:-)
答案 0 :(得分:1)
通过这样一个简单的示例,当可以直接调用内部函数时,没有理由在node.js或任何其他JavaScript环境中使用这样的匿名函数。
进行审核时,我经常会假设任何console.log
(或您选择的语言记录)都是偶然的。如果周围的资源本身没有做任何有价值的事情,那么它可能仅打算在开发和调试过程中支持console.log
(可能已过期)。
由于JavaScript是单线程的,因此构造此类匿名函数严格用于作用域。对于没有执行力的原始源代码(即,它缺少()
),这实际上是一种从运行时“隐藏”调试代码的方法,如果有一步,则将其保留在原位通过调试完全需要它。
调试时,只需添加('isValid succeeded')
即可执行其中的所有源代码。
(function(foo){
console.log(foo);
})( /* You're missing a parameter value here; will print 'undefined'. */ );
答案 1 :(得分:1)
有时您使用匿名函数来限制代码的范围。如果您不想用变量来污染全局范围,那么它可能会派上用场。而且,它使依赖注入更易于测试。
请考虑以下示例:
var a = 2, b = 3;
function print(x)
{
console.log('x= ', x);
}
print(a+b);
在上面的示例中,a
,b
和print
现在属于窗口对象。当代码增长时,就很难保持跟踪并避免名称冲突。如果您使用的是第三方库等,问题将变得更加严重。
在下面的示例中,您的代码被包装在保护全局范围的匿名函数中。您还可以将参数传递给匿名函数
(function(localParam){
var a = 2, b = 3;
function print(x)
{
console.log('x= ', x);
}
print(a+b);
//also
console.log(localParam); // = safe way to access and global variables
})(globalParam);