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_Syntax - Fatal编程技术网

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完全无关。