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

在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:意外的令牌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作为语句),它们实际上是函数表达式(使用function作为操作符)。 这意味着他们的名字不会成为当前名字空间中的自身引用。


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


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


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

  • 逗号操作符,让你在同一行做多的表现。
  • 函数表达式对很多事情都很有用,可以立即调用它们,以便关闭或者将它们存储在变量等内。

  • 用圆括号包装代码会强制它被解析为一个表达式。

    var关键字仅作为语句有效,因此会产生语法错误。

    函数声明可以是语句(它会创建一个提升变量)或表达式(不会创建任何变量)。

    因此,将函数包装在括号中会将它变成一个函数表达式,它不会创建一个外部可见的名称。

    有关更多信息,请参阅此处。

    链接地址: http://www.djcxy.com/p/59085.html

    上一篇: Javascript: rounded parentheses surrounding comma separated expressions

    下一篇: What scope are variables globally defined by "var"?