Javascript 为什么这个分组运算符是+;立即调用的函数

Javascript 为什么这个分组运算符是+;立即调用的函数,javascript,iife,Javascript,Iife,我正在研究立即调用函数表达式(IIFE)的行为,在研究过程中遇到了以下情况 (function () { document.write("bar"); }) (function () { document.write("foo"); }()); 我认为第一个只是一个分组操作符,里面有一个函数表达式,没有调用它。第二个是一个分组运算符以及一个函数表达式,但现在是该函数的调用 我觉得奇怪的是,两者都被调用了,为什么 (function () { document.writ

我正在研究立即调用函数表达式(IIFE)的行为,在研究过程中遇到了以下情况

(function () {
    document.write("bar");
})

(function () {
    document.write("foo");
}());
我认为第一个只是一个分组操作符,里面有一个函数表达式,没有调用它。第二个是一个分组运算符以及一个函数表达式,但现在是该函数的调用

我觉得奇怪的是,两者都被调用了,为什么

(function () {
    document.write("bar");
})

var x = 1;

(function () {
    document.write("foo");
}());

当我通过在两者之间插入变量声明来打破两者时,它只是写入foo。这就是我所期望的。

因为您忘记了第一个函数表达式后面的分号:

(function () {
    document.write("bar");
});
否则,第二个“分组运算符”将被解释为函数调用。因此:

(function a() {
    ...
})

(function b() {
    ...
}());
基本上与:

function b() {
    ...
}

(function a() {
    ...
})(b());

重新排序使其更易于查看。请记住,空格字符在JavaScript中没有任何意义,会被忽略。

正如Felix Kling正确指出的那样:缺少分号会导致第二个IIFE周围的括号被解释为函数调用,而不仅仅是对函数表达式进行分组。如果没有换行符,情况会变得更加清楚:

(function () {
    document.write("bar");
})(function () {
    document.write("foo");
}());
或者通过一些调整:

(function () {
    document.write("bar");
})(
    function () {
        document.write("foo");
    }()
);

调用第一个函数表达式时,将第二个函数表达式的结果作为其第一个也是唯一的参数。您还应该注意,
foobar
是编写的,而不是
barfoo
,因为第二个函数首先被调用,其结果作为参数传递给第一个函数。

您也可以这样编写IIFE:
(函数(){})(

通过省略分号,您的第一个代码段实际上调用了第一个函数,并将第二个IIFE作为第一个函数的参数传递

                    executing as parameter for the first IIFE
                                               \/ 
(function () {document.write("bar");})( (function () {document.write("foo");}());)
它首先打印
foo
,然后打印
bar
,不同于:

(function () {
    document.write("bar");
})();

(function () {
    document.write("foo");
}());
哪个打印
barfoo

(function () {
    document.write("bar");
});

(function () {
    document.write("foo");
}());
其中第一个现在仅被视为分组运算符。

提示:使用