我正在回答有关quora的问题并遇到类似以下内容:
// if(true)
{
var qq = 1;
}
我立即启动了chrome并尝试了以下
{
var qq = 1;
}
令我惊讶的是没有语法错误。我认为这可能是一种在没有函数的情况下设置闭包的方法,但唉,这是真的。
为什么这是有效的JavaScript?这有用吗?这有什么问题吗?
答案 0 :(得分:2)
这是block。
Syntactically,一个块只是一堆组合在一起的语句。
Block : { StatementList }
StatementList
: StatementListItem
| StatementList StatementListItem
StatementListItem
: Statement
| Declaration
但这里是棘手的部分:块也是陈述。
Statement : BlockStatement
BlockStatement : Block
你有它,现在你可以用抽象if
来定义复合语句,例如while
或Statement
,而不必担心它是否是单个语句或者一个街区。
IfStatement
: if ( Expression ) Statement else Statement
| if ( Expression ) Statement
IterationStatement
: while ( Expression ) Statement
| for ( LeftHandSideExpression in Expression ) Statement
| for ( LeftHandSideExpression of AssignmentExpression ) Statement
不是很漂亮吗?
作为这种语言设计的副作用,块可以在其中包含其他块 - 在语言规范中明确禁止这个怪癖是不值得的,尽管在EcmaScript 5.1内部块中的语义确实是多余的并且很少使用。
{
var x = 1;
{
var x = 2; // The same variable as in the outer block.
console.log(x); //=> 2
}
console.log(x); //=> 2
}
然而,在最新的EcmaScript 6(2015)标准中,这些块确实具有语义价值,如下一个示例所示:
{
let x = 1;
{
let x = 2; // New variable, visible in this block only.
console.log(x); //=> 2
}
console.log(x); //=> 1
}
答案 1 :(得分:2)
这些块仅用于if(){}, function(){}, switch(){}, for(..){}, etc
等语句。
在此示例中:
var number = 0;
if(true)
number = 1
else
number = 2
number = 3 //This line is evaluated because no longer is in the `else` condition
console.log(number); //3
使用块不会发生这种情况:
var number = 0;
if(true)
{
number = 1
}
else
{
number = 2
number = 3
}
console.log(number); //1
不使用任何语句使用块是不必要的,例如:
var foo = 2;
foo = 3;
console.log(foo) //3
与执行相同:
var foo = 2;
{
foo = 3;
}
console.log(foo) //3
如果您正在ES6环境中开发,则除外。在块中使用let声明非常重要。这些将仅在块内进行评估。
let foo = 2;
{
let foo = 3;
}
console.log(foo) //2