Javascript 函数在分配给变量时工作,但在自身执行时抛出SyntaxError

Javascript 函数在分配给变量时工作,但在自身执行时抛出SyntaxError,javascript,Javascript,我有过这样的生活: (function a() { return "b"; }()); 在控制台中执行时,返回b 我删除了第一组括号,认为这将使a函数成为全局函数,但仍然有效,并返回b: 但它抛出了一个语法错误: 然后,我尝试通过分配给变量将函数转换为表达式,结果成功了: var c = function a() { return "b"; }(); console.log(c); // prints b 为什么会发生这种情况?为什么它作为一个表达式而不是它本身工作?第二段代码

我有过这样的生活:

(function a() {
    return "b";
}());
在控制台中执行时,返回b

我删除了第一组括号,认为这将使a函数成为全局函数,但仍然有效,并返回b:

但它抛出了一个语法错误:

然后,我尝试通过分配给变量将函数转换为表达式,结果成功了:

var c = function a() {
   return "b";
}();
console.log(c); // prints b

为什么会发生这种情况?为什么它作为一个表达式而不是它本身工作?

第二段代码不是它看起来的样子

此代码看起来像一个正在立即执行的函数:

function a() {
    return "b";
}()
但实际上,它只是一个函数声明,后跟一个空表达式,这是不允许的:

function a() {
    return "b";
}

() // not allowed - empty expression
本·阿尔曼在《生活论》中解释了这一点:

当解析器在全局范围内遇到function关键字时,或 在函数内部,它将其视为函数声明语句, 默认情况下,不作为函数表达式

而放在表达式后面的paren表示表达式 是要调用的函数,放在语句后面的参数是 完全独立于前面的陈述,只是一个 分组运算符,用作控制 评估

分组运算符需要包含一个要计算的表达式。它本身没有任何意义:

() // meaningless
2 + 3 * 4 // 15
(2 + 3) * 4 // 20
在IIFE中,外圆括号只是一种迫使解析器期望表达式的方法

这就是为什么表达式var c=函数{return b;};同样有效;这是因为解析器知道由于c的赋值而需要一个表达式

旁注

Alman还建议不要在分配给variablesi.e时使用不使用外圆括号的自调用函数。var v=函数{…},因为这是一种不好的做法:

如果围绕 函数表达式是不必要的,因为解析器已经存在 需要一个表达式,在制作时使用它们仍然是一个好主意 转让,作为惯例

此类参数通常表示函数表达式将 立即调用,变量将包含 函数,而不是函数本身。这可以避免有人阅读你的文章 编码必须向下滚动到可能发生的事情的底部的麻烦 是一个很长的函数表达式,以查看它是否已被调用或 不是


第二段代码不是它看起来的样子

此代码看起来像一个正在立即执行的函数:

function a() {
    return "b";
}()
但实际上,它只是一个函数声明,后跟一个空表达式,这是不允许的:

function a() {
    return "b";
}

() // not allowed - empty expression
本·阿尔曼在《生活论》中解释了这一点:

当解析器在全局范围内遇到function关键字时,或 在函数内部,它将其视为函数声明语句, 默认情况下,不作为函数表达式

而放在表达式后面的paren表示表达式 是要调用的函数,放在语句后面的参数是 完全独立于前面的陈述,只是一个 分组运算符,用作控制 评估

分组运算符需要包含一个要计算的表达式。它本身没有任何意义:

() // meaningless
2 + 3 * 4 // 15
(2 + 3) * 4 // 20
在IIFE中,外圆括号只是一种迫使解析器期望表达式的方法

这就是为什么表达式var c=函数{return b;};同样有效;这是因为解析器知道由于c的赋值而需要一个表达式

旁注

Alman还建议不要在分配给variablesi.e时使用不使用外圆括号的自调用函数。var v=函数{…},因为这是一种不好的做法:

如果围绕 函数表达式是不必要的,因为解析器已经存在 需要一个表达式,在制作时使用它们仍然是一个好主意 转让,作为惯例

此类参数通常表示函数表达式将 立即调用,变量将包含 函数,而不是函数本身。这可以避免有人阅读你的文章 编码必须向下滚动到可能发生的事情的底部的麻烦 是一个很长的函数表达式,以查看它是否已被调用或 不是


你认为函数a{返回b;}的结果是什么;如果它真的起作用的话会怎么样?@epascarello捕捉得好。我将更新这个问题。你认为函数a{return b;};如果它真的起作用的话会怎么样?@epascarello捕捉得好。我会更新这个问题。