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)
因此,命名函数既不能在括号内引用.
命名函数不是"被困在里面",因为它们不是函数声明(function用作语句),它们实际上是函数表达式(function用作运算符).这意味着它们的名称不会成为当前名称空间中对它们自身的引用.
某些关键字/标记只能用作语句,例如var,如果您尝试在解释器期望作为表达式的条件中使用它们,则会引发错误.
至于y === 2,这是因为你没有var y;内部C,所以y = 2设置window.y,并且在全局范围内this === window.
什么是这个结构的用法/目的?
,可以让你在同一行做多的表现.