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
。