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捕捉得好。我会更新这个问题。