没有函数或json的JavaScript花括号

Dja*_*ave 14 javascript

刚打开一个客户端的javascript文件,第一行是这样的:

{
    var s_account="blog";
}
Run Code Online (Sandbox Code Playgroud)

我没有得到.通常,根据我的经验,花括号缠绕一个函数...

function welcome(){ ...
Run Code Online (Sandbox Code Playgroud)

......或者 JSON JavaScript对象

var attributes = { this : "that...
Run Code Online (Sandbox Code Playgroud)

任何人都可以告诉我为什么在他们之前或之后没有文字的花括号?它做了什么/有什么意义呢?

Esa*_*ija 13

它是一个块,除非你标记它,否则完全没有意义:

block: {
    var s_account="blog";
    console.log("executed");
    break block;
    console.log("not executed");
}
Run Code Online (Sandbox Code Playgroud)

  • @RocketHazmat是的,它到了标记块的末尾 (2认同)

Shm*_*dty 9

在我看来,做这样的事情的唯一合乎逻辑的理由是作为一种组织技术.

function banana(){
    // private members
    {
        var foo = "foo",
            bar = "bar",
            baz = "baz";

        function bux(){
            console.log("bux");
        }
    }

    // public members

    this.fin = "fin";
    this.fang = "fang";
    this.foom = "foom";

    this.shamalamadingdong = function(){
        bux();
    };
}
Run Code Online (Sandbox Code Playgroud)

此外,大多数IDE将允许您折叠"私有成员"阻止并使其脱离您的方式.


Ben*_*ick 7

任何人都可以告诉我为什么在他们之前或之后没有文字的花括号?它做了什么/有什么意义呢?

在Javascript中没有重要的意义.它的行为与代码完全相同

var  s_account="blog";
Run Code Online (Sandbox Code Playgroud) 推测

在具有块范围的其他语言中,这可能会限制变量的范围,但由于JS没有该功能(无论好坏),没有控制结构或功能的大括号基本上没有意义并被忽略.

很可能这段代码是从已删除的函数或if语句中遗留下来的.它绝对不是一个可以复制的模式.

  • 现在我们使用let和const来阻止范围,这在某些情况下可能很有用 (3认同)
  • 代码将完全相同.这并不意味着它毫无意义.按照你的逻辑,换行是没有意义的吗?JS中有一半的分号是没有意义的吗?评论毫无意义吗?正如人们在下面指出的那样,IDE和许多文本编辑器允许您折叠块语句.它们允许您使用不仅仅是空格来分割代码.-1如果有有效答案,则为非答案. (2认同)

T.J*_*der 7

那是块语句。块语句有多种用途,该代码没有使用任何一种用途(除了可能像 Shmiddty 建议的那样将内容组合在一起)。(事实上​​,我想在那段代码中说它们适得其反,因为对于许多从所有变量声明都是块范围的语言来使用 JavaScript 的人来说,他们给人的印象是变量的范围是块,它不是。)

它可以有以下用途:

范围let, const, 和class

如果代码使用letconst或者class,块范围将所得到的识别符,因为letconstclass 块作用域在JavaScript。所以这输出"bar"

{
    var foo = "bar";
}

console.log(foo);
Run Code Online (Sandbox Code Playgroud)

但这会抛出一个ReferenceError因为foo范围为块:

{
    let foo = "bar";
}

console.log(foo);
Run Code Online (Sandbox Code Playgroud)

提供一个块来打破

正如Esailija 指出的那样,如果它被标记并使用break,则中断将提前退出块。

附加到流控制语句的分组语句

块语句最常见的用途是将附加到流控制语句(如if和 )的语句组合在一起for。在这个相当典型的if

if (something) {
    doThis();
    doThat();
}
Run Code Online (Sandbox Code Playgroud)

......该{}不是一部分if(你可以写if不使用{}),他们是一个块语句连接到if


Roc*_*mat 6

它被称为块语句.它允许您分组表达式.它通常与像控制结构使用ifwhile,但也可单独使用.

由于JavaScript没有块范围,因此代码在相同的范围内运行(就好像{}它们不在那里).

例:

{
    var s_account="blog";
}

console.log(s_account);
Run Code Online (Sandbox Code Playgroud)

这很好.

  • 阅读关于函数声明的*Note*作为[语句](http://es5.github.io/#x12)...尝试在声明上方的FF中调用它,它将失败. (2认同)
  • @RocketHazmat"JavaScript没有块范围" - 版本<= 5,除了`with`语句和`try/catch`. (2认同)