JavaScript花括号没有函数或JSON

20

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

{
    var s_account="blog";
}

我不明白。在我的经验中,花括号通常用于包装一个函数...

function welcome(){ ...

...或者一个jsonJavaScript对象

var attributes = { this : "that...

有人能告诉我为什么花括号前后没有文字吗?它是用来做什么的?


7
那不是一个“JSON对象”,而是一个“JavaScript对象”。 - gen_Eric
5
我能找到的唯一支持这些托架的理由都是不好的理由... - Denys Séguret
2
也许写这段代码的人认为JavaScript具有块级作用域(实际上并没有),并试图缩小s_account的作用域。 - go-oleg
2
@FlorianMargaine 我认为Rocket指的是“或者一个JSON对象var属性” - Denys Séguret
2
好的好的!JavaScript 对象 :) - Djave
显示剩余11条评论
6个回答

17

这是一个块级元素,如果没有标签,它完全没有意义:

block: {
    var s_account="blog";
    console.log("executed");
    break block;
    console.log("not executed");
}


你可以像那样使用 break 吗? - gen_Eric
@RocketHazmat 是的,只需通过您的控制台运行它。或者添加条件断点,当条件为假时看到警报执行。 - Esailija
1
我从未使用过标签。那么,它是否像“goto”一样运作? - gen_Eric
2
@RocketHazmat 是的,它会跳转到标记块的末尾。 - Esailija
1
这确实很有帮助。我们还能用块做什么呢?我猜我们可以像使用迷你开关或迷你函数那样在它们之间跳转? - jemiloii
显示剩余3条评论

13

在我看来,这样做的唯一合理原因是作为一种组织技巧。

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();
    };
}

此外,大多数集成开发环境将允许您折叠“私有成员”块,并将其从视线中移除。


嘿,那是一个非常好的观点,特别是关于IDE内可折叠的侧边栏。虽然里面只有一个变量,但这很奇怪...我的另一个想法是它可能是生成的代码。 - Djave
当使用约定时,变量的数量并不重要。如果您打算使用该约定,则应始终使用它。 - Shmiddty

12
那是一个块语句。块语句有多种用途,但该代码未使用任何目的(除了可能像Shmiddty建议的那样将内容分组 as Shmiddty suggested)。 (事实上,我要说,在那段代码中它们是适得其反的,因为对于很多从所有变量声明都是块作用域的语言转到JavaScript的人来说,它们会产生变量仅在块中使用的错觉,而这是不正确的。)
可以使用的功能:
作用域let、const和class
如果该代码正在使用let、const或class,则块将作用域生成的标识符,因为let、const和class在JavaScript中是块作用域的。 因此,这个输出“bar”:

{
    var foo = "bar";
}

console.log(foo);

但是这会抛出一个ReferenceError,因为foo的作用域限制在块级中:

{
    let foo = "bar";
}

console.log(foo);

提供一个可中断的块

Esailija指出,如果它被标记并且使用break,那么break会提前退出该块。

将语句与流程控制语句相关联分组

块语句最常见的用途是将与流程控制语句(如iffor)相关联的语句分组在一起。在这个相当典型的if中:

if (something) {
    doThis();
    doThat();
}

...{}不是if语句的一部分(你可以在不使用{}的情况下写if),它们是一个与if附加的块语句。


我认为你的 let foo = "bar"; 示例仍然会输出 bar - Djave
@Djave - 试一下,这是一个可运行的代码片段。 :-) 只有当 JavaScript 引擎实现 let 的方式出现问题时,它才会记录 "bar"。我不知道有哪些实现方式是有问题的。 (IE9 对 let 的实现已经过时,无法处理与 for 循环相关的重要用例,但 IE9 不允许在块中使用 let,因此它不会记录上面的 "bar"。[我不确定,所以我试了一下。 :-) ]) - T.J. Crowder
1
啊哈...我明白我做了什么...我把它们复制粘贴到终端里了...所以第二个 console.log 记录了那个 var 扇脸 - Djave
@Djave - 哈哈!是的,那就解释了。:-D - T.J. Crowder

7

它被称为块语句。它可以将表达式分组。通常与控制结构(如ifwhile)一起使用,但也可以单独使用。

由于JavaScript没有块级作用域,代码在同一个作用域中运行(就像{}不存在一样)。

例如:

{
    var s_account="blog";
}

console.log(s_account);

那很好运作。


1
只是它不允许在内部进行函数声明... - Bergi
2
请阅读有关函数声明的注释,作为语句……尝试在声明之上在FF中调用它,它将失败。 - Bergi
3
“JavaScript 在版本号小于等于5时,并且除了 'with' 语句和 'try/catch' 语句之外,没有块级作用域。” - Benjamin Gruenbaum

7
有人能告诉我为什么会有没有文本的大括号吗?它是做什么用的?
在Javascript中,它们没有太大的意义。这段代码与只有文本的代码完全相同。
var  s_account="blog";

在其他具有块级作用域的语言中,这可能会限制变量的范围,但由于JS没有该特性(好或坏),没有控制结构或函数的大括号基本上是没有意义且被忽略的。
但很可能这段代码是从已删除的函数或if语句中遗留下来的。它绝对不是一个要复制的模式。

6
现在我们有了使用let和const的块级作用域,这在某些情况下可能很有用。 - Henrik Karlsson
2
代码将完全相同。这并不意味着它是毫无意义的。按照您的逻辑,换行符是无意义的吗?JS 中一半的分号是无意义的吗?注释是无意义的吗?正如下面的人们指出的那样,IDE 和许多文本编辑器允许您折叠块语句。它们允许您使用更多不仅仅是空格的方式来分段您的代码。当有有效答案时,非答案得分为-1。 - RoboticRenaissance

0

快速添加。 在一些IDE(集成开发环境)中,例如Visual Code,放置花括号实际上会创建一个带有“下拉”箭头的可视块,使您可以通过单击完全隐藏代码的一部分。 它有助于代码组织。 我在创建具有大量CSS的HTML元素时使用它。 由于它不影响代码执行,因此非常有用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接