Javascript 为什么自动执行匿名可以工作?

Javascript 为什么自动执行匿名可以工作?,javascript,function,self-executing-function,Javascript,Function,Self Executing Function,我知道自动执行匿名。通常我们将它们创建为 (function(){ return 1;})() 如果我们使用 function(){ return 1}() 但今天我发现下一个代码也能工作(检查括号顺序) function(){return 1;}()仍然应该给我SyntaxError 请解释一下原因?请参考Thx以获取更多详细信息 问题是关于(function(){return 1;}())变量 (function() {})() 及 它们是等价的 要调用第二个示例,可以在函数之前包含+

我知道自动执行匿名。通常我们将它们创建为

(function(){ return 1;})()
如果我们使用

function(){ return 1}()
但今天我发现下一个代码也能工作(检查括号顺序)

function(){return 1;}()
仍然应该给我SyntaxError

请解释一下原因?请参考Thx以获取更多详细信息

问题是关于
(function(){return 1;}())
变量

(function() {})()

它们是等价的

要调用第二个示例,可以在函数之前包含
+
运算符

+function(){ return 1 }()

它们是等价的

要调用第二个示例,可以在函数之前包含
+
运算符

+function(){ return 1 }()

参见短语
IIFE
是这些功能的更好术语。。立即调用的函数表达式

至于为什么它们是相同的:外部参数
()
只是创建一个表达式,而
()
一起执行调用

(function(){ return 1;})()
is the same as:
(function(){ return 1;}())


(function(){ return 1;})()
becomes
(functionexpression)()
becomes
functionexpression()

出于同样的原因

(3)+2
((3)+2)
相同

编辑

function(){ return 1; }()

由于
函数语句
函数表达式
不同,因此不起作用。函数语句不能立即调用。

短语
IIFE
是这些函数的更好术语。。立即调用的函数表达式

至于为什么它们是相同的:外部参数
()
只是创建一个表达式,而
()
一起执行调用

(function(){ return 1;})()
is the same as:
(function(){ return 1;}())


(function(){ return 1;})()
becomes
(functionexpression)()
becomes
functionexpression()

出于同样的原因

(3)+2
((3)+2)
相同

编辑

function(){ return 1; }()

由于
函数语句
函数表达式
不同,因此不起作用。无法立即调用函数语句。

您没有在(Function(){return 1;}()中关闭paraenthesis。它是包含函数的文本--所有这些都是正确的,因为语法不正确。此:
Function(){return 1;}()
只是没有被定义为有效的语法。@VasiliyVanchuk读到这一点:这与
{a:1,b:2}[a]
不起作用的原因相同。
{
..
}
是一个块,而不是一个对象。这是因为
{
被解释为一个语句,而不是一个表达式。
({a:1,b:2})[a]
({a:1,b:2}[a])
确实有效,因为
..
强制将
{
..
}
解释为表达式(对象)。函数也是一样的,因为有函数语句和函数表达式。为什么?因为JavaScript就是这样设计的。您没有在(function(){return 1;}()中关闭paraenthesis,它是包含函数的文本,因为语法不正确。这:
function(){return 1;}()
只是没有被定义为有效的语法。@VasiliyVanchuk读到这一点:这与
{a:1,b:2}[a]
不起作用的原因相同。
{
..
}
是一个块,而不是一个对象。这是因为
{
被解释为一个语句,而不是一个表达式。
({a:1,b:2})[a]
({a:1,b:2}[a])
确实有效,因为
..
强制将
{
..
}
解释为表达式(对象)。函数也是如此,因为有函数语句和函数表达式。为什么?因为JavaScript就是这样设计的。有比
+
更好的运算符可供使用。原因是
+
作为二进制运算符重载,因此如果在前一个运算符之后意外忘记了分号表达式,它将尝试将以前的表达式添加到函数中。这基本上与使用
()
时遇到的问题相同。如果要使用替代运算符强制表达式,请使用一元运算符,例如
。@斜视“有比
+
更好的运算符可供使用,“如果要使用替代运算符强制表达式,请使用一元运算符,例如
。”是的,但不是针对这种特殊情况;
!function(){return 1}()
返回
false
而不是
1
@斜视,
;null,function(){return 1}()
如果捕获返回值,则不需要任何运算符使函数成为有效表达式。但是,是的,任何避免对运算符进行意外计算的方法都会更好。我过去曾多次使用过
void
。有比
+
更好的运算符可供使用。原因是
+
过于复杂如果你不小心忘记了前面表达式后面的分号,它会尝试将前面的表达式添加到函数中。这与人们使用
()
。如果要使用替代运算符强制表达式,请使用一元运算符,如
。@斜视“有比
+
”更好的运算符可供使用,”如果要使用替代运算符强制表达式,请使用一元运算符,如
。是,但不是针对这种特殊情况;
!function(){return 1}()
返回
false
而不是
1
@斜视;
;null,function(){return 1}()
如果捕获返回值,则不需要任何运算符使函数成为有效表达式。但是,是的,任何避免意外计算运算符的方法都更好。我过去曾多次使用过
void