我最近被一个虫子咬了。我有这样的代码:
if (x == 1)
{
do_stuff();
}
else
{
do_other_stuff();
}
但是,我错误地省略了else
一词,因此总是执行第二个代码块。
允许这种独立代码块的理由是什么?我认为有充分的理由。
答案 0 :(得分:4)
block语句在其他语言中通常称为复合语句。它允许您在JavaScript只需要一个语句的情况下使用多个语句。将语句组合成块是JavaScript中的一种常见做法。使用空语句可能会出现相反的行为,尽管您需要提供一个不提供任何语句的语句。
该块由一对大括号分隔,并且可以选择为labelled(这意味着它可以与break或Continue语句一起使用)
此外,它允许使用let
或const
var x = 'Function scope'; {
let x = 'Block Scope';
console.log(x);
}
console.log(x);
参考:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/block
答案 1 :(得分:4)
block statement仅用于复合语句的分组。
这允许break
在函数或站点外运行,而无需使用return
语句。
var a = 10;
block: {
if (a === 10) break block;
console.log('still in block');
}
console.log('outside block');
答案 2 :(得分:3)
这样想吧……独立块不是该语言允许的特殊结构,而是这些块是一种声明。引用MDN:
阻止语句(或其他语言的复合语句)用于将零个或多个语句分组。
这意味着if
/ else
之类的结构可以定义为
if (<<expression>>) <<statement>> [ else <<statement>> ]
由于foo()
和{ foo(); }
都是语句,因此语言可以将以下内容视为同一内容:
if (true) foo();
if (true) { foo(); }
您说您是由于错字而被“咬伤”的。尽管孤立块是该语言的核心功能,但它们可能是逻辑错误或代码气味的标志。如果您想尽早发现此类问题,建议您在项目中安装eslint。特别是no-lone-blocks
规则可以捕获此特定的错误。启用此规则后,以下代码:
if (x == 1)
{
do_stuff();
}
{
do_other_stuff();
}
会产生错误:
块是多余的。 (无孤立块)
答案 3 :(得分:1)
if
,else
,for
,do
和while
期望一个语句。
块只是执行多个语句的一种方法-或不执行任何语句。
允许独立式块,原因与允许独立式语句相同。如果您忘记了else
,则此代码也会失败,因为do_other_stuff()
总是会执行:
if (x == 1)
do_stuff();
else
do_other_stuff();