什么';Javascript中单独使用代码块的目的是什么?

什么';Javascript中单独使用代码块的目的是什么?,javascript,Javascript,在Javascript中,可以在代码中任意放置单独的代码块,即没有if、函数或类似函数的代码块,如下所示: var a = 3, b = 4; { a = 50; b = 50; } alert(a + b); //alerts 100 我知道有些其他语言有这个(我认为C++),他们用它来进行范围控制:在孤独代码块内声明的变量不能在它之外访问。但是由于Javascript具有函数作用域而不是块作用域,因此必须使用自执行函数(function(){})()来实现相同的效果 这种构造有目的

在Javascript中,可以在代码中任意放置单独的代码块,即没有
if
函数或类似函数的代码块,如下所示:

var a = 3,
b = 4;
{
  a = 50;
  b = 50;
}
alert(a + b); //alerts 100
我知道有些其他语言有这个(我认为C++),他们用它来进行范围控制:在孤独代码块内声明的变量不能在它之外访问。但是由于Javascript具有函数作用域而不是块作用域,因此必须使用自执行函数
(function(){})(
)来实现相同的效果


这种构造有目的吗?你见过有人用过吗?说明书上提到了吗?这仅仅是语法对代码块有某种一般规则的副作用吗?

只是代码可读性,仅此而已

它们甚至没有提供闭包的优势:

var c = 'fail';
{
    var c = 123;
}
alert(c); //alerts 123

()只有可读性。除此之外,什么都没有。不要这样做,因为这不是未来的证明。以下内容将很好地打破:

"use strict";

var a = 3,
b = 4;
{
  a = 50;
  b = 50;
}
alert(a + b); //alerts 100

我曾经自己使用它,因为它允许功能的逻辑分离,但由于上述原因,我不再使用它。

我在搜索我的答案后发现,单独的代码块可能与标签有关:

myLabel:
{
    for(x in y) {
        break myLabel;
    }
}
将不仅打破循环,还将打破外部代码块。

更新(这个问题在Google上高度显示为“javascript代码块”):

随着ECMAScript 6中
let
关键字的引入,代码块也可以用来限制变量的范围

{
    let x = 20;
    alert(x) // 20
}
alert(x) // undefined

规格说明:我认为大多数时候,您看到这段代码是由错误地认为自己得到了块范围的人编写的。有些人知道它不提供范围控制,因为他们喜欢视觉分组,所以使用它,但我发现这很难阅读,因为它意味着范围,让我想知道原始编码者的意思。@FelixKling和其他人一样可以理解…@c69:这不一定是我的意图。我只是想表明它在规范中(re:规范提到了吗?)@FelixKling——这已经被弃用了,或者有计划弃用,不确定。它不适用于
使用严格的
,也不适用于未来的ES5引擎。你说的可见性是什么意思?@PeterOlson:我是说代码可读性。这只有在阅读代码时才有用,我不知道这样做的其他原因。可能在某些情况下,它更具可读性。就我个人而言,我永远不会在JavaScript中使用这种语法。@sissonb:我也永远不会使用这种语法-我尽量编写可读的代码,而不使用不必要的“构造”。但问题是关于这些块的用途,事实上唯一的目的是(有争议的)提高代码可读性。(除非有人犯了错误并认为它将作为
(function(){/*…*/})(
)工作)。因此,基本上有两个可能的原因:1)可读性,2)错误;)使用代码分段表示逻辑分离不是更简单、更易于维护吗?@PeterOlson——我主要用于更大的脚本。像
程序配置
句柄命令行选项
错误处理
等都被分解成各自的部分,然后用匿名块包装起来。它“强制”了所有代码都属于某一组功能的想法。如果做得好,它看起来非常干净和清晰。实际上,在考虑了一些问题后,我不确定这在技术上是否是正确的答案。通过对代码块进行标记,您可能不会认为它是严格的孤独:而不是Afor或函数等,它附加到一个标签上。无论如何,我都会接受它。事实上,我从这个答案中学到了一些东西,其他人基本上告诉了我我已经知道的东西。将中断改为继续,当它应该开始在代码块顶部执行时,它就无法工作了。表示未定义的标签!这是怎么回事,当唯一的区别是它是一个中断声明时被识别出来的@user3015682:这解释了
继续标签的方式作品:。这是您尝试的:。请尝试以下方法:。不同之处在于,在您的例子中,您没有标记loop语句。