这个有效的javascript是如何实现的?它的用途是什么?

时间:2015-06-30 04:58:27

标签: javascript

我正在回答有关quora的问题并遇到类似以下内容:

// if(true)
{
   var qq = 1;
}

我立即启动了chrome并尝试了以下

{
   var qq = 1;
}

令我惊讶的是没有语法错误。我认为这可能是一种在没有函数的情况下设置闭包的方法,但唉,这是真的。

为什么这是有效的JavaScript?这有用吗?这有什么问题吗?

2 个答案:

答案 0 :(得分:2)

这是block

Syntactically,一个块只是一堆组合在一起的语句。

Block : { StatementList }
StatementList
    : StatementListItem
    | StatementList StatementListItem
StatementListItem
    : Statement
    | Declaration

但这里是棘手的部分:块也是陈述。

Statement : BlockStatement
BlockStatement : Block

你有它,现在你可以用抽象if来定义复合语句,例如whileStatement,而不必担心它是否是单个语句或者一个街区。

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
}

letconst是ES6引入的块范围变量声明。

答案 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