【问题标题】:JavaScript curly braces with no function or json没有函数或 json 的 JavaScript 花括号
【发布时间】:2013-08-10 09:38:55
【问题描述】:

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

{
    var s_account="blog";
}

我不明白。通常,根据我的经验,花括号会包裹一个函数......

function welcome(){ ...

...或一个 json JavaScript 对象

var attributes = { this : "that...

谁能告诉我为什么花括号前面或后面没有文字?它有什么作用/有什么意义?

【问题讨论】:

  • 这不是“JSON 对象”,而是“JavaScript 对象”。
  • 我能找到的那些牙套的唯一原因是不好的原因......
  • 也许写这本书的人认为 JavaScript 具有块作用域(它没有)并试图缩小 s_account 的作用域。
  • @RocketHazmat 这甚至不是一个 JavaScript 对象。这只是一个块。
  • @FlorianMargaine 我认为火箭指的是“或 json 对象 var 属性”

标签: javascript


【解决方案1】:

除非你给它贴上标签,否则它是一个块并且完全没有意义:

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

【讨论】:

  • 你可以这样使用breaks 吗?
  • @RocketHazmat 是的,只需通过您的控制台运行它。或者添加条件中断,当条件为假时查看警报执行。
  • 我从未使用过标签。那么,它的行为类似于“goto”吗?
  • @RocketHazmat 是的,它转到标记块的末尾
  • 这真的很有帮助。我们还能用块做什么?我猜我们可以在它们周围跳跃,就好像它们是迷你开关或迷你功能一样?
【解决方案2】:

在我看来,这样做的唯一合乎逻辑的原因是作为一种组织技术。

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 都允许您折叠“私人成员”块并将其排除在外。

【讨论】:

  • 嘿,这是一个非常好的观点,尤其是关于 IDE 内的可折叠侧。它很奇怪,但它只有一个变量......我的另一个想法可能是它生成的代码。
  • 在使用约定时,变量的数量并不重要。如果您打算使用该约定,则应该始终使用它。
【解决方案3】:

这是一个块语句。块语句有多种用途,该代码没有使用任何一种(除了可能将内容组合在一起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 points out,如果它被标记并使用break,break 将提前退出块。

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

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

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

...{} 不是一部分if(你可以写if 而不使用{}),它们是一个块语句附加到if。

【讨论】:

  • 我认为您的 let foo = "bar"; 示例仍然记录 bar。
  • @Djave - 试试看,它是一个可运行的 sn-p。 :-) 记录"bar" 的唯一方法是JavaScript 引擎的let 实现有问题。我不知道有任何以这种方式损坏的。 (IE9 有一个过时的 let 实现,它失败了与 for 循环相关的重要用例,但 IE9 不允许在块中使用 let,因此它不会记录上面的 "bar"。[我不是当然,所以我试了一下。:-) ])
  • 啊……我明白了我做了什么……我将它们复制并粘贴到终端中……所以第二个console.log 记录了var facepalm
  • @Djave - 哈哈!是的,这就解释了。 :-D
【解决方案4】:

谁能告诉我为什么花括号前面或后面没有文字?它有什么作用/有什么意义?

在 Javascript 中对它们没有意义。它的行为就像代码只是

var  s_account="blog";
猜测

在其他具有块作用域的语言中,这可能会限制变量的作用域,但由于 JS 没有该特性(无论好坏),没有控制结构或函数的大括号本质上是没有意义的并被忽略。

该代码很可能是从已删除的函数或 if 语句中遗留下来的。绝对不是抄袭的模式。

【讨论】:

  • 现在我们有了 let 和 const 的块作用域,这在某些情况下可能很有用
  • 代码的行为完全相同。这并不意味着它没有意义。按照您的逻辑,换行符没有意义吗? JS中一半的分号是没有意义的吗? cmets没有意义吗?正如人们在下面指出的那样,IDE 和许多文本编辑器允许您折叠块语句。它们允许您使用不仅仅是空格来分割您的代码。当有有效答案时,-1 表示未回答。
【解决方案5】:

它被称为block statement。它允许您对表达式进行分组。它通常与if 和while 等控制结构一起使用,但也可以单独使用。

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

例子:

{
    var s_account="blog";
}

console.log(s_account);

效果很好。

【讨论】:

  • 只是它不允许在里面声明函数……
  • 将函数声明中的注意读为statements...尝试在声明上方的FF中调用它会失败。
  • @RocketHazmat "JavaScript 没有块作用域" - 在版本 with 语句和 try/catch 除外。
【解决方案6】:

快速添加。 在像 Visual Code 这样的 IDE 中,放置花括号实际上会创建一个带有“下拉”箭头的可视块,只需单击一下即可完全隐藏部分代码。 它有助于代码组织。 我在使用大量 CSS 创建 HTML 元素时使用它。 由于不影响代码执行,所以非常有用。

【讨论】:

    猜你喜欢
    • 2020-11-13
    • 2011-08-20
    • 2022-01-19
    • 1970-01-01
    • 2017-05-22
    • 2012-01-18
    • 2011-05-08
    相关资源
    最近更新 更多