Javascript:语法和新关键字
考虑一个定义如下的类:Javascript:语法和新关键字,javascript,syntax,Javascript,Syntax,考虑一个定义如下的类: class Foo { static bar() { return this; } } 我可以用new(Foo.bar())()构造一个实例 但是new Foo.bar()()会导致Uncaught类型错误:Foo.bar不是构造函数 为什么这些额外的括号是必要的? 首先,您需要知道什么是IIFE(立即调用的函数表达式)。 IIFE是顾名思义的,您可以在声明后立即调用函数。但JS解析器应该将整个表达式看作一个表达式 前 (function(){console.log(
class Foo { static bar() { return this; } }
我可以用new(Foo.bar())()
构造一个实例
但是new Foo.bar()()
会导致Uncaught类型错误:Foo.bar不是构造函数
为什么这些额外的括号是必要的?
- 首先,您需要知道什么是IIFE(立即调用的函数表达式)。
IIFE是顾名思义的,您可以在声明后立即调用函数。但JS解析器应该将整个表达式看作一个表达式
前
(function(){console.log(“foo”)}())
!函数(){console.log(“foo”)}()
+function(){console.log(“foo”)}()
所有这些都迫使解析器将function(){console.log(“foo”)}()
端视为完整的表达式,以便可以立即调用
- 其次是
new(Foo.bar())()
的工作原理
使用第一个括号中的new(Foo.bar())()
时,返回this
,即Foo
本身。因为bar
方法正在返回Foo
。在第二个括号之后,()
调用它(Foo),然后new
is创建一个Foo
的新实例。基本上,您正在使用IIEF编写newfoo()
- 第三,为什么
newfoo.bar()
抛出错误
当JS解析器看到表达式new Foo.bar()
时,如果Foo.bar
和Foo.bar
不是构造函数,它会立即尝试创建一个实例。之后,JS抛出该错误
但若解析器看到()
,它可能会抛出另一个错误,未捕获的语法错误:意外的标记'
。因为JS无法理解该行剩下的内容,()
区别
new Foo.bar()()
和new(Foo.bar())()
同
function(){console.log(“foo”)}()
和(function(){console.log(“foo”)})(
它抛出不同的错误并停止解析,因为Foo.bar
不是要调用的构造函数
我希望有帮助
有些链接需要理解。
new Foo.bar()()
与(new Foo.bar())()
相同
查看,new
和函数调用在同一组中。在规范中,new
的处理可能有些混乱。但是,将首先执行新的
检查特定代码段的解析方式的一个很好的工具是——它允许您查看解析结果
然后,您得到的错误消息来自Foo.bar
,它是一个类方法,没有[[Construct]],不能与new
一起使用
提示:当有点不清楚如何解析表达式时,添加显式大括号通常会提高可读性,即使它们可能不是必需的。
new Foo.bar()
与(new Foo.bar())()
相同,因为bar
不是构造函数。操作顺序。第一个例子,调用foo.bar(),不管它返回什么,都要创建一个新的实例,然后执行它。第二个示例,创建一个new
foo.bar,执行它,并假设它返回一个函数,也执行该函数。完全不同。@ASDFGerte为什么?这是一种边缘情况,因为函数调用和new在同一个组中,new在规范中有点奇怪,但这是解析的工作方式,您可以检查,例如,如果没有,这与IIFEs完全无关。