代码之家  ›  专栏  ›  技术社区  ›  Andrey Bushman

前分号(()=>true)()

  •  0
  • Andrey Bushman  · 技术社区  · 6 年前

    它工作得很好:

    const foo = 1; // any number, string, bolean or object
    (() => console.log('stuff'))()
    

    但是没有分号是不行的:

    const foo = 1 // TypeError: 1 is not a function
    (() => console.log('stuff'))()
    


    匿名函数的调用不应该被视为 单独的指示 当第一个括号不能解释为前一条指令的正确延续时

    4 回复  |  直到 6 年前
        1
  •  1
  •   melpomene    6 年前

    是的,但只是 延续。

    1(() => console.log('stuff'))()
    

    是语法正确的表达式,解析为“call” 1 () => console.log('stuff') ,然后不带参数地调用该结果”。这将在运行时引发异常( 1 不是函数,因此无法调用),但它仍然是有效表达式。

        2
  •  1
  •   nitobuendia    6 年前

    你应该总是用分号。如果不添加它们,Javascript将猜测在何处插入它们,并将导致错误。

    在您的例子中,您调用的是函数。

    how semicolons are automatically inserted :

    规范:解析器将每一个新标记作为当前标记的一部分 语句,除非有分号终止它。这个 被插入,但不是。这说明了省略的风险

    无ASI:

    a = b + c
    (d + e).print()
    

    这不会触发ASI,因为在函数调用中,左括号可以跟在c后面。以上就是这样 解释为:

    a = b + c(d + e).print();
    
        3
  •  0
  •   Bergi    6 年前

    当第一个括号不能解释为前一条指令的正确延续时?

    但是它可以-正如你所看到的,代码解析得很好,并且可以执行。当没有插入分号时,它将引发运行时异常,这对 ASI ,解析时无法知道。

        4
  •  0
  •   Jiachen Guo    6 年前

    在javascript中,不管你有多少个空间,它只会被视为一个空间。

    在第二段代码中,它实际上等于:

    const foo = 1 (() => console.log('stuff'))()
    

    这意味着您调用名为“1”的函数并传递“()=>console.log('stuff')作为参数。但显然1不是一个函数,所以它抛出了一个错误,希望对你有意义