首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >JavaScript的分组操作符是如何工作的?

JavaScript的分组操作符是如何工作的?
EN

Stack Overflow用户
提问于 2015-05-21 13:30:58
回答 4查看 2.4K关注 0票数 20

JavaScript的分组操作符是如何工作的?

代码语言:javascript
复制
1 + 2;
(1 + 2);

function(){ return 1} + "text";  // SyntaxError
(function(){return 1} + "text");

根据上面的代码,我有以下问题:

为什么1 + 2;可以在没有语法错误的情况下工作,而function(){ return 1} + "text"会引发SyntaxError?

  • How?(function(){return 1} + "text")中的分组运算符能修复语法错误吗?
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-05-21 13:37:40

function位于语句的开头时,它被视为命名函数定义的开头,如下所示:

代码语言:javascript
复制
function someName() { return 1; }

这是一个语句,不是一个表达式,所以它不能用作更大的表达式的一部分。

实际上,没有名称的语句是无效的。出现语法错误的原因如下:

代码语言:javascript
复制
function() { return 1}

全靠它自己。

但是当你把它放在括号后面时,它不再是语句的开头,所以它是一个函数表达式,它以值的形式返回函数。然后,它可以用作更大表达式中的子表达式。

这不是分组运算符做的,只是因为它不在语句的开头。例如,您还可以这样写:

代码语言:javascript
复制
var foo = function() { return 1 } + "text";
票数 29
EN

Stack Overflow用户

发布于 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"。在第一个示例中,函数被解析为语句,不能添加到其他内容中。在第二个示例中,括号使函数被解析为表达式,这允许将其添加到其他内容中。

这就是为什么“自调用函数模式”总是在匿名函数周围添加一对括号。

代码语言:javascript
复制
(function(){
     ...
 }())
票数 16
EN

Stack Overflow用户

发布于 2017-08-18 21:34:26

问题是关于分组运算符()或优先运算符。

初步说明:"function name(){}“中使用的括号是函数语法的一部分(idem代表函数调用),而不是分组运算符。

分组运算符具有比任何其他运算符更高的优先级,这正是因为它的作用是改变其中包含的表达式的优先级(即在括号中)。这意味着在表达式的其余部分中使用括号内的表达式的值之前,将对其进行完全计算。从此以后:

代码语言:javascript
复制
(1+2); // strictly equivalent to 1+2;
       // because nothing more in the expression

或者:

代码语言:javascript
复制
var x = ("3"==3)? "ok":"ko"; // grouping operator is useless as well

..。但是(如Barmar‘’answer中所述):语法"function () {return 1;}",当放在()之间时,由分组运算符操作,并被视为在完整语句中使用之前要执行的表达式,有两个后果:

  1. 允许匿名函数,因为我们在函数表达式中;要执行
  2. ,函数表达式必须具有提供给其参数的参数,并且-if您期望返回值(Note2)-第二对括号是必需的,必须包含参数,或者不包含参数。(function(){return 1;}());

Note2:最初的问题是提到这个例子:

代码语言:javascript
复制
(function(){return 1} + "text");  //-> function(){return 1}text

as没有返回语法错误:它是正确的,但它以字符串值的形式返回函数的代码,而不是值1,后跟字符串'text‘。为什么?因为执行时没有提供括号。我们应该这样写:

代码语言:javascript
复制
(function(){return 1}()) + "text"; //-> 1text
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30365281

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档