这两个使用parens的函数闭包有什么不同吗?

时间:2014-08-22 16:16:59

标签: javascript

JS使用这两种函数有什么不同吗?在第二个函数中,它包含在括号中以便进一步关闭。但它真的有所作为吗?

var test2 = function () {

    var open = function () { }          
    return {
        open: open
    };

}();

var test = (function () {
    var open = function () {
    };

    return {
        open: open
    };
})();

3 个答案:

答案 0 :(得分:2)

不,没有区别,但是很多人会在函数声明周围加上括号,因为如果省略变量声明,javascript语法会不正确:

function () { // javascript parser gives an error here
    var open = function () { }          
    return {
        open: open
    };
}();  

(function () {
    var open = function () {
    };

    return {
        open: open
    };
})(); // this works just fine.

出于习惯,我可能会使用括号。这样,其他开发者不必抓挠他们的头脑并且不知道"是允许的吗?"

答案 1 :(得分:0)

不,没有。由于您的函数出现在=之后,解析器需要一个表达式。您在IIFE之前看到(的唯一原因是您需要让解析器期望看到表达式。如果解析器期望看到statement-or-expression,并且它看到function,那么它假定它找到了一个函数声明而不是函数 expression ,因此,在这种情况下(对于IIFE)没有(会导致解析错误。

答案 2 :(得分:-1)

上下文中,没有。

JavaScript有function expressionsfunction statements。您的示例的语法在运算符后面有function关键字,因此JavaScript编译器知道您有function expression

<强>无论其

使用parens是优选的,因为它为人类读者提供了以下代码是IIFE而非常规函数调用的线索。

其他

在你没有经营者的情况下,这些人确实会有所作为。

(function() { /* do stuff }())

完全不同于:

function() { /* do stuff }()