何时在Node.js中使用匿名函数?

时间:2019-01-08 16:31:48

标签: javascript node.js

最近,我正在调试我的一个同事编写的一些代码,并在较大的函数内部的有条件的条件下找到了类似的东西。

(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);
    }
    ...
}

谢谢:-)

2 个答案:

答案 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);

在上面的示例中,abprint现在属于窗口对象。当代码增长时,就很难保持跟踪并避免名称冲突。如果您使用的是第三方库等,问题将变得更加严重。

在下面的示例中,您的代码被包装在保护全局范围的匿名函数中。您还可以将参数传递给匿名函数

(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);