JavaScript的分组操作符是如何工作的?
1 + 2;
(1 + 2);
function(){ return 1} + "text"; // SyntaxError
(function(){return 1} + "text");
根据上面的代码,我有以下问题:
为什么1 + 2;
可以在没有语法错误的情况下工作,而function(){ return 1} + "text"
会引发SyntaxError?
(function(){return 1} + "text")
中的分组运算符能修复语法错误吗?发布于 2015-05-21 13:37:40
当function
位于语句的开头时,它被视为命名函数定义的开头,如下所示:
function someName() { return 1; }
这是一个语句,不是一个表达式,所以它不能用作更大的表达式的一部分。
实际上,没有名称的语句是无效的。出现语法错误的原因如下:
function() { return 1}
全靠它自己。
但是当你把它放在括号后面时,它不再是语句的开头,所以它是一个函数表达式,它以值的形式返回函数。然后,它可以用作更大表达式中的子表达式。
这不是分组运算符做的,只是因为它不在语句的开头。例如,您还可以这样写:
var foo = function() { return 1 } + "text";
发布于 2015-05-21 13:40:55
1+2;
在大多数语言中都可以使用受C语言启发的语法。Javascript中允许的语句之一是只包含表达式的语句。这是为了允许只包含函数调用的语句,比如foo();
或像x=5;
这样的赋值语句。是的,Javascript中的赋值被认为是表达式而不是语句,这就是为什么你可以搬起石头砸自己的脚,并将赋值放在if语句条件中(经典的=
vs ==
错误)。最后,编译器将很难禁止无用的表达式语句,例如1+2;
,同时仍然允许foo()
和x = 5;
。
function(){}
和(function(){})
的事情是Javascript的怪癖。Javascript has different rules in the grammar for "function declaration statements" and "function expressions"。在第一个示例中,函数被解析为语句,不能添加到其他内容中。在第二个示例中,括号使函数被解析为表达式,这允许将其添加到其他内容中。
这就是为什么“自调用函数模式”总是在匿名函数周围添加一对括号。
(function(){
...
}())
发布于 2017-08-18 21:34:26
问题是关于分组运算符()或优先运算符。
初步说明:"function name(){}“中使用的括号是函数语法的一部分(idem代表函数调用),而不是分组运算符。
分组运算符具有比任何其他运算符更高的优先级,这正是因为它的作用是改变其中包含的表达式的优先级(即在括号中)。这意味着在表达式的其余部分中使用括号内的表达式的值之前,将对其进行完全计算。从此以后:
(1+2); // strictly equivalent to 1+2;
// because nothing more in the expression
或者:
var x = ("3"==3)? "ok":"ko"; // grouping operator is useless as well
..。但是(如Barmar‘’answer中所述):语法"function () {return 1;}",当放在()之间时,由分组运算符操作,并被视为在完整语句中使用之前要执行的表达式,有两个后果:
Note2:最初的问题是提到这个例子:
(function(){return 1} + "text"); //-> function(){return 1}text
as没有返回语法错误:它是正确的,但它以字符串值的形式返回函数的代码,而不是值1,后跟字符串'text‘。为什么?因为执行时没有提供括号。我们应该这样写:
(function(){return 1}()) + "text"; //-> 1text
https://stackoverflow.com/questions/30365281
复制相似问题