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