Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript:围绕逗号分隔表达式的圆括号_Javascript_Scope_Closures - Fatal编程技术网

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

Javascript:围绕逗号分隔表达式的圆括号,javascript,scope,closures,Javascript,Scope,Closures,在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 这将失败: (变量

在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
这将失败:

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

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

然后实例化:

>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

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

将代码括在括号中会强制将其解析为表达式

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

函数声明可以是语句(创建被提升的变量)或表达式(不创建任何变量)

因此,将函数包装在括号中会将其转换为函数表达式,而不会创建外部可见的名称


有关详细信息,请参见。

命名函数不是“被困在内部”,因为它们不是函数声明(使用),实际上是函数表达式(使用)。这意味着它们的名称不会成为当前命名空间中对它们自己的引用


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


至于
y===2
,这是因为您没有
var y
C
内部,因此
y=2
设置
window.y
,并在全局范围
中设置此===window


这种构造的用途/目的是什么

  • 允许您在一行上执行多个表达式
  • 函数表达式对于很多事情都很有用,无论是立即调用它们以获得闭包,还是将它们存储在变量中,等等

命名函数不是“被困在里面”,因为它们不是函数声明(使用
函数作为语句),它们实际上是函数表达式(使用
函数作为运算符)。此外:命名函数表达式的名称应该只在函数本身内部可见(以允许递归),因此没有定义f的错误。非常好的文章!好的,关于声明和表达式。。对于全局对象的赋值,即使在“另一个this”用例中进行了评估(除了用于独立闭包的自执行函数之外)?@aleclofabbro:我不确定你在问什么。我的意思是(x=1,y=2)总是隐式地将x和y赋值给globalobject(globalobject.x==1,globalobject.y==2)即使它是在构造函数中计算的function@aleclofabbro:那是因为您没有将它们声明为局部变量。请注意,全局范围与此
不同。
>( function f(){console.log('i am f')} , f() )
ReferenceError: f is not defined