为什么立即调用此分组运算符+函数

Mar*_*n B 9 javascript iife

我正在研究Immediatly Invoked Function Expressions(IIFE)的行为,在这样做时我遇到了以下情况.

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

(function () {
    document.write("foo");
}());
Run Code Online (Sandbox Code Playgroud)

我认为第一个只是一个分组运算符,里面有一个函数表达式而不调用它.第二个是分组运算符以及函数表达式,但现在调用该函数.

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

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

var x = 1;

(function () {
    document.write("foo");
}());
Run Code Online (Sandbox Code Playgroud)

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

Fel*_*ing 15

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

(function () {
    document.write("bar");
});
Run Code Online (Sandbox Code Playgroud)

否则,第二个"分组运算符"被解释为函数调用.所以这:

(function a() {
    ...
})

(function b() {
    ...
}());
Run Code Online (Sandbox Code Playgroud)

基本相同:

function b() {
    ...
}

(function a() {
    ...
})(b());
Run Code Online (Sandbox Code Playgroud)

重新排序使它更容易看到.请记住,空格字符在JavaScript中没有任何意义,会被忽​​略.