Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/417.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用JavaScript';分组操作员的工作是什么?_Javascript - Fatal编程技术网

如何使用JavaScript';分组操作员的工作是什么?

如何使用JavaScript';分组操作员的工作是什么?,javascript,Javascript,JavaScript的分组操作符是如何工作的 1 + 2; (1 + 2); function(){ return 1} + "text"; // SyntaxError (function(){return 1} + "text"); 鉴于上述代码,我有以下问题: 为什么1+2工作时没有语法错误,而函数(){return 1}+“text”引发语法错误 (function(){return 1}+“text”)中的分组运算符如何修复语法错误 当function位于语句开头时,它被视为命名

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

1 + 2;
(1 + 2);

function(){ return 1} + "text";  // SyntaxError
(function(){return 1} + "text");
鉴于上述代码,我有以下问题:

  • 为什么
    1+2工作时没有语法错误,而
    函数(){return 1}+“text”
    引发语法错误
  • (function(){return 1}+“text”)
    中的分组运算符如何修复语法错误

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

    function someName() { return 1; }
    
    这是一条语句,不是表达式,因此不能用作更大表达式的一部分

    事实上,没有名字的语句是无效的。您从以下位置获得语法错误:

    function() { return 1}
    
    完全靠自己

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

    并不是分组运算符执行此操作,只是它不在语句的开头。例如,您还可以编写:

    var foo = function() { return 1 } + "text";
    

    1+2
    在大多数语言中都可以使用C语法。Javascript中允许的语句之一是只包含表达式的语句。这是为了允许只包含函数调用的语句,例如
    foo()或赋值语句,如
    x=5。是的,Javascript中的赋值被认为是表达式而不是语句,这就是为什么允许您在if语句条件(经典的
    =
    vs
    =
    bug)中插入赋值。最后,编译器很难禁止无用的表达式语句,例如
    1+2同时仍然允许
    foo()
    x=5

    function(){}
    vs
    (function(){})
    是一个Javascript怪癖。在第一个示例中,函数被解析为语句,不能添加到其他内容中。在第二种情况下,括号将函数解析为表达式,从而允许将其添加到其他内容中

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

    (function(){
         ...
     }())
    

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

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

    分组运算符的优先级高于任何其他运算符,这正是因为它的作用是更改其中包含的表达式的优先级(即在括号中)。这意味着括号内的表达式在其值用于表达式的其余部分之前会被完全计算。从今以后:

    (1+2); // strictly equivalent to 1+2;
           // because nothing more in the expression
    
    或:

    。。。但是(如巴尔马回答中所述): 当置于()之间时,语法“function(){return 1;}”由分组运算符操作,并被视为在完整语句中使用之前要执行的表达式,有两种结果:

  • 匿名函数是允许的,因为我们在一个函数表达式中
  • 要执行,函数表达式必须为其参数提供参数,并且-如果您希望返回值(注2)-必须使用第二对括号来包含参数,或者不包含参数。 (函数(){return 1;}()) 注2:原始问题提到了以下示例:

    (function(){return 1} + "text");  //-> function(){return 1}text
    
    as不返回语法错误:这是正确的,但它以字符串值的形式返回函数的代码,而不是值1,后跟字符串“text”。为什么?因为没有为执行提供括号。我们应该写:

    (function(){return 1}()) + "text"; //-> 1text
    
    语法错误的原因是ECMAScript sespecification要求函数声明必须有名称

    function foo (){return 1}+"text" // result is NaN
    
    为什么它会导致
    NaN
    ?因为上述代码等同于以下代码

    function foo(){
        return 1;
    }
    
    +"text"
    
    +“text”
    作为单独的语句读取。根据ECMAScript规范+运算符,字符串前的运算符将其强制为数值。因此它被解释为
    Number(“text”)
    ,其计算结果为
    NaN
    。这里是到的链接

    为什么
    (function(){return 1}+“text”)
    会导致
    “function(){return 1}text”

    分组运算符允许匿名函数,因为函数表达式可以是非匿名的。分组运算符强制将其内容作为表达式计算。我们知道函数是对象的子类型。所以下面的加号(+)规则,也称为concatation运算符,将在这里应用--

    这里将调用
    ToPrimitive
    。它将返回函数的字符串表示形式。然后,简单的字符串推理将产生最终结果

    那么根据上面的规则,

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

    因此,这个表达式的结果将是
    “function(){return1}text”

    是“1+2”;表达式或语句?,是“function(){}”表达式或语句?,我这样问是因为我发现了这个白色的ecmascript规范:生产主表达式:(表达式)的计算如下:
    1+2
    是表达式<代码>1+2是一个;包含单个表达式的语句在任何表达式中都可以用作语句,但不能反过来使用。例如,您不能编写
    (var a=3)+4
    ,因为
    var a=3
    是一个语句,而不是一个表达式
    function foo(){
        return 1;
    }
    
    +"text"
    
    function_Object + primitive_String => ToPrmitive(function_Object ) + primitive_String 
                                       => (function_Object).toString() + primitive_String
                                       => String_representation_of_function + primitive_String
    
    (function(){return 1} + "text");