gpt4 book ai didi

javascript - 为什么两个函数调用的括号之间的换行符不被视为 js 中的两个语句?

转载 作者:数据小太阳 更新时间:2023-10-29 05:49:10 26 4
gpt4 key购买 nike

为什么在js上做这种烂设计?这样设计自动插入分号是不是有什么特别的原因?

这是我的代码,它不适用于 js 中的 chrome:

(function(){console.log("abc");})()

(function(){console.log("123");})();

这里是错误:

Uncaught TypeError: (intermediate value)(...) is not a function

我知道这段代码的正确版本是:

(function(){console.log("abc");})();

(function(){console.log("123");})();

我就是想知道为什么js语法设计的这么蠢。历史原因?

我还添加这个问题作为警告大家尝试使用javascript的自动分号插入,请在需要的地方添加;,javascript的自动分号插入是垃圾。它不像您期望的那样工作。

现有的答案对我来说太复杂了,所以我问一个新的:

https://stackoverflow.com/a/2846298/1586797

另一个看起来不错但不能用的案例2:

x=1

(function(){console.log("123");})()

最佳答案

链接问题的答案解释了 ASI 规范的三个规则,例如 this one .长话短说:

  • 如果不起作用,请尝试使用分号。

  • 程序应该以分号结尾。

  • 如果一个语句说“这里不能放换行符”,用分号惩罚它。

您的代码不满足任何条件。

  • 第一行可以返回一个函数,如果是这样,应该允许调用该函数;所以第二行开头的(不是非法的

  • 第一行不是程序的最后一行

  • 这里没有语法限制。

因此,没有适合您的自动分号。

一些人因此声称虽然 (f(){})() 语法是很好的 IIFE 语法,但是 !f(){}() 改为:

!function(){console.log("abc");}()

!function(){console.log("123");}();

这是按预期工作的,因为 ! 只是否定了函数应用程序的(丢弃的)结果,而且因为 ! 作为纯一元运算符是一个非法字符来继续第一行(即 f(){}()! 不是东西)。这会触发规则 1,并且 ASI 可以发生。

反对意见是它很丑陋(即对于任何不熟悉这种做法的人来说,他们需要一段时间才能理解 ! 在这个成语中的目的)。

你的第二个例子在本质上是相似的:就 JS 解析器而言,1 是一个值(事实上它是一个整数并且不可能是一个函数有点丢失到它)。看这个在语法上完全等同于你的例子:

a=function(f) { console.log("A CALLED!"); return f; }
x=a
(function(){console.log("123");})()
# => A CALLED!
123

这里,a是一个函数,所以它可以用function(){console.log("123");}作为参数调用;它在打印到控制台后返回 function(){console.log("123");} 不变;然后 () 调用该返回值,并且 123 也被打印出来。一切正常。因此,规则 #1 没有被触发,没有分号给你。

关于javascript - 为什么两个函数调用的括号之间的换行符不被视为 js 中的两个语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51816366/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com