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