为什么我们不能立即调用函数声明?

Sle*_*v7n 1 javascript expression function

为什么我们需要编写一个计算结果为函数类型的表达式才能立即调用函数?为什么我们不能只声明一个函数并立即调用它?

为什么

(function(){}()) or !function(){}()
Run Code Online (Sandbox Code Playgroud)

为什么不只是

function(){}()
Run Code Online (Sandbox Code Playgroud)

我想这与如何将这些内容存储在内存中有关,但是我很难找到一个完整的答案。

Cer*_*nce 7

因为当}到达函数声明的末尾时,解释器将其之前的整个函数声明视为单个语句。如果在后面加上任何内容},它将被解释为一个单独的,未使用的表达式:

function foo() {
}('bar')
Run Code Online (Sandbox Code Playgroud)

这将创建一个bar字符串,但是解释器不对其执行任何操作-就像

该字符串已声明,但未在任何地方使用。

如果您没有在括号中添加任何内容,则会抛出SyntaxError,因为解释器期望语句或表达式,但()单独一个都不是。

这有点像把东西放在if一块之后。不管你以后放什么}的的if块,其后的内容将被解释为一个完全独立的语句/表达式:

if (true) {
  // do something
}'foo';
Run Code Online (Sandbox Code Playgroud)

在这里,就像函数声明示例一样,您正在创建一个包含的字符串foo,但表达式未使用。