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

job*_*bin 17 javascript

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

1 + 2;
(1 + 2);

function(){ return 1} + "text";  // SyntaxError
(function(){return 1} + "text");
Run Code Online (Sandbox Code Playgroud)

鉴于上述代码,我有以下问题:

  1. 为什么1 + 2;没有语法错误,而function(){ return 1} + "text"引发SyntaxError?
  2. 分组操作符如何(function(){return 1} + "text")修复语法错误?

Bar*_*mar 25

function它位于语句的开头时,它被视为命名函数定义的开头,它应该类似于:

function someName() { return 1; }
Run Code Online (Sandbox Code Playgroud)

这是一个语句,而不是表达式,因此它不能用作更大表达式的一部分.

事实上,没有名字的声明是无效的.您从以下位置收到语法错误:

function() { return 1}
Run Code Online (Sandbox Code Playgroud)

一个人.

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

它不是分组运算符,而是它不在语句的开头.例如,你也可以写:

var foo = function() { return 1 } + "text";
Run Code Online (Sandbox Code Playgroud)

  • @jobin任何表达式都可以用作语句,但不是相反.例如,你不能写`(var a = 3)+ 4`因为`var a = 3`是一个语句,而不是表达式. (2认同)

hug*_*omg 14

1+2;是在大多数语言中使用C语言的语法.Javascript中允许的一种语句是一个只包含表达式的语句.这是为了允许只包含函数调用的foo();语句,例如或赋值语句x=5;.是的,Javascript中的赋值被认为是表达式而不是语句,这就是为什么你被允许在脚中射击并将赋值放在if语句条件(经典=vs ==bug)中.最后,编译器很难禁止无用的表达式语句,例如1+2;仍然允许foo()x = 5;.

function(){}VS (function(){})的是一个Javascript怪癖.Javascript在"函数声明语句"和"函数表达式"的语法中有不同的规则.在第一个示例中,函数被解析为语句,不能添加到其他内容中.在第二个中,括号使函数被解析为表达式,这允许将其添加到其他事物中.

这就是为什么"自调用函数模式"总是在匿名函数中添加一对括号.

(function(){
     ...
 }())
Run Code Online (Sandbox Code Playgroud)