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

ale*_*bro 4 javascript closures scope

在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
Run Code Online (Sandbox Code Playgroud)

这将失败:

(var c = 2)SyntaxError:意外的令牌变量

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

function C(){
    ( function f(){console.log('i am f')} , (function x(){console.log('i am x')})() , y=2 , console.log('hello') )
}
Run Code Online (Sandbox Code Playgroud)

然后实例化:

>var c=new C()
i am x
hello
undefined
>c.y
undefined
>this.y
2
Run Code Online (Sandbox Code Playgroud)

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

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

多一个:

>( function f(){console.log('i am f')} , f() )
ReferenceError: f is not defined
Run Code Online (Sandbox Code Playgroud)

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

Pau*_* S. 6

命名函数不是"被困在里面",因为它们不是函数声明(function用作语句),它们实际上是函数表达式(function用作运算符).这意味着它们的名称不会成为当前名称空间中对它们自身的引用.


某些关键字/标记只能用作语句,例如var,如果您尝试在解释器期望作为表达式的条件中使用它们,则会引发错误.


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


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

  • 逗号操作符,可以让你在同一行做多的表现.
  • 函数表达式对于很多东西都很有用,可以立即调用它们,这样你就可以有一个闭包,或者将它们存储在变量中等等.