这两个使用父类的函数闭包有什么区别吗?

Is there any difference with these two function closures using parens?

本文关键字:闭包 函数 什么 区别 父类 两个      更新时间:2023-09-26

在JS中使用这两种类型的函数有什么区别吗?在第二个函数中,它被包装在圆括号中,用于额外的闭包。但这真的有区别吗?

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

不,没有区别,但许多人会在函数声明周围加上括号,因为如果省略变量声明,这将是不正确的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.

所以出于习惯,我可能会使用括号。这样其他开发者就不用挠头思考"这是允许的吗?"

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

这个上下文中,没有。

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

然而

使用父类是可取的,因为它给人类读者一个提示,下面的代码是一个IIFE,而不是一个常规的函数调用。

另外

在没有操作符的情况下,父操作符的作用是不同的。

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

完全不同
function() { /* do stuff }()