没有函数或 json 的 JavaScript 花括号

IT技术 javascript
2021-03-09 08:01:05

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

{
    var s_account="blog";
}

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

function welcome(){ ...

...或一个 json JavaScript对象

var attributes = { this : "that...

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

6个回答

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

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

@RocketHazmat 是的,它转到标记块的末尾
2021-04-30 08:01:05
我从来没有用过标签。那么,它是否像一个“goto”?
2021-05-02 08:01:05
@RocketHazmat 是的,只需通过您的控制台运行它。或者添加条件中断并在条件为假时查看警报执行。
2021-05-11 08:01:05
你可以这样使用breaks 吗?
2021-05-13 08:01:05
这真的很有帮助。我们还能用块做什么?我猜我们可以在它们周围跳来跳去,就好像它们是迷你开关或迷你功能一样?
2021-05-18 08:01:05

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

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

使用约定时,变量的数量应该无关紧要。如果您打算使用该约定,则应始终使用它。
2021-05-09 08:01:05
嘿,这是一个非常好的观点,尤其是关于 IDE 内的可折叠侧。它很奇怪,但它只有一个变量......我的另一个想法可能是它生成的代码。
2021-05-20 08:01:05

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

它可以有以下用途:

范围let, const, 和class

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

{
    var foo = "bar";
}

console.log(foo);

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

{
    let foo = "bar";
}

console.log(foo);

提供一个块来打破

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

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

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

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

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

我认为你的let foo = "bar";例子仍然记录bar
2021-04-22 08:01:05
@Djave - 大声笑!是的,这就解释了。:-D
2021-04-23 08:01:05
@Djave - 试试看,这是一个可运行的片段。:-) 它将记录的唯一方法"bar"是 JavaScript 引擎是否有损坏的let. 我不知道有任何以这种方式被破坏的。(IE9 有一个过时的实现,let它在与for循环相关的重要用例中失败,但 IE9 不允许let块,所以它不会"bar"在上面记录。[我不确定,所以我试过了。:-)])
2021-04-28 08:01:05
啊……我明白我做了什么……我把它们复制并粘贴到终端中……所以第二个console.log记录了var facepalm
2021-05-01 08:01:05

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

在 Javascript 中对它们没有任何意义。它的行为与代码完全相同

var  s_account="blog";
投机

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

但是,此代码很可能是从已删除的函数或 if 语句中遗留下来的。它绝对不是可以复制的模式。

代码将完全相同。这并不意味着它没有意义。按照你的逻辑,换行符毫无意义吗?JS 中的分号有一半是没有意义的吗?评论毫无意义?正如人们在下面指出的那样,IDE 和许多文本编辑器允许您折叠块语句。它们允许您使用不仅仅是空格来分割代码。-1 表示有有效答案时未回答。
2021-04-26 08:01:05
现在我们有 let 和 const 的块作用域,这在某些情况下可能很有用
2021-05-07 08:01:05

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

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

例子:

{
    var s_account="blog";
}

console.log(s_account);

这很好用。

@RocketHazmat“JavaScript 没有块作用域”——在版本 <=5 中,除了with语句和try/catch.
2021-04-25 08:01:05
只是它不允许内部的函数声明......
2021-05-13 08:01:05
阅读关于函数声明作为语句注释……尝试在声明上方的 FF 中调用它,它会失败。
2021-05-20 08:01:05