gpt4 book ai didi

Javascript:围绕逗号分隔表达式的圆括号

转载 作者:搜寻专家 更新时间:2023-11-01 05:01:18 26 4
gpt4 key购买 nike

在 JS 控制台上玩时,我遇到了一个奇怪的语法。我想知道是否有人可以告诉我更多关于这方面的信息..

试试这个:

>( function f(){console.log('i am f')} , (function x(){console.log('i am x')})() , y=2 , console.log('hello') )
i am x
hello
undefined
>f()
ReferenceError: f is not defined
>this.y
2

这会失败:

( var c=2 ) SyntaxError: Unexpected token var

因此评估括号内的逗号分隔表达式,赋值恰好是针对全局范围的,但是命名函数声明引用就像闭包一样被困在里面更多的...将该行放在用 new 调用的函数声明中:

function C(){
( function f(){console.log('i am f')} , (function x(){console.log('i am x')})() , y=2 , console.log('hello') )
}

然后实例化:

>var c=new C()
i am x
hello
undefined
>c.y
undefined
>this.y
2

发生完全相同,就像在全局范围内执行的一样!

这个结构的用途/目的是什么?

还有一个:

>( function f(){console.log('i am f')} , f() )
ReferenceError: f is not defined

因此既不能在括号内引用命名函数。

最佳答案

命名函数并没有“被困在里面”,因为它们不是函数声明(使用function as a statement),它们实际上是函数表达式(使用function as an operator)。这意味着它们的名称不会成为当前命名空间中对它们自身的引用。


某些关键字/标记只能用作语句,例如 var,因此如果您尝试在解释器预期为表达式的条件下使用它们,则会抛出错误。


至于y === 2,这是因为你在C里面没有var y;,所以y = 2 设置window.y,并且在全局范围内this === window


whats the usage / purpose of this construct?

  • comma operator ,允许您在一行中执行多个表达式。
  • 函数表达式 可用于很多事情,无论是立即调用它们以便您拥有闭包,还是将它们存储在变量中,等等。

关于Javascript:围绕逗号分隔表达式的圆括号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18303976/

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