【问题标题】:JavaScript code conventions - variable declaration [closed]JavaScript 代码约定 - 变量声明 [关闭]
【发布时间】:2012-03-17 01:03:21
【问题描述】:

在 JavaScript 中声明变量更不容易出错的方法是什么?

var a;
var b;
var c;

var a,
    b,
    c;

jQuery 和 Dojo 使用第二种方法,就代码易读性而言,我个人最喜欢第二种方法,问题是我发现它更难调试。

示例 1:

var a,
    b,
    c; // oops.. semicolon instead of comma
    d,
    e;

示例 2:

在项目中搜索某个变量时,var 突出显示该变量正在被声明。

编辑:原来的例子是错误的,我在复制和粘贴时犯了一个错误。代码已经更新,不便之处见谅。

【问题讨论】:

  • 您的意思是用分号代替逗号吗?这会在 Safari 中引发未定义的变量错误。
  • @JeffreySweeney 您在运行代码时是否出错?逗号工作正常。
  • 这个问题的答案是主观的。 stackoverflow.com/faq#dontask
  • @amnotiam 你确定哪种方法更容易出错的答案是主观的吗?我找不到任何理由说明多个声明会容易出错。组合声明在客观上似乎更容易出错。
  • @amnotiam 同意,它似乎确实可以回答自己,因此可能是 NARQ...

标签: javascript variables syntax coding-style


【解决方案1】:

由于您提到的原因,多个变量声明(而不是组合)不太容易出错。但是,组合声明还有其他一些优点:

  • JSLint 和可能的其他 linter 会抱怨每个范围有多个 var 关键字。
  • 单个 var 关键字比许多关键字更容易缩小,原因很明显。
  • 组合声明会强制您将变量声明在一个位置,可能靠近它们所在函数的开头,这被认为是一种好的做法。

另一方面,正如您所提到的,使用组合变量声明可能会犯错误,并且它们可能会在差异中笨拙地表示。

只要你在整个项目中保持一致的变量声明风格,你选择的风格应该不重要。

【讨论】:

    【解决方案2】:

    我更喜欢您只使用一个 var 关键字的第二种方法。最近我更进一步,将类型实例化到每个变量上,以帮助我防止以后意外的类型重铸。一个例子是:

    var a = 0,
        b = 0,
        c = {},
        d = [],
        f = "";
    

    如果此时我有要提供的值,我会在此处提供一个实际值。如果不是,我提供以下虚拟值:

    • 0 用于数字类型
    • [] 用于数组
    • {} 用于对象字面量和 DOM 节点
    • "" 为字符串
    • function () {return;} 函数
    • false 为布尔值
    • 为此,我不担心为 Math、Date 或 RegExp 类型预分配类型。

    【讨论】:

    • 这似乎是一个很好的解决方案,还可以防止弱类型相关的错误。
    • 我的主要动机是表现。最新的解释器更喜欢严格的打字,所以我不得不改变我的行为和风格,以适应这种对专业质量编码的新的非官方要求。
    • 为什么是function() {return;}function() {} 会做同样的事情。
    • 很高兴知道这显然可以提高性能。另一方面,能够判断变量是否已定义通常很有用(包括在调试中),如果你在一开始就给它赋值,这是不可能的。
    【解决方案3】:
    var a;
    var b;
    var c;
    

    是更好的方法,因为它不会抛出未定义的错误。变量也将被正确地限定范围而不是在全局范围内。

    var a=10;
        b=5;
    

    将导致 b 在全局范围内。

    编辑:这与最初发布的示例 https://stackoverflow.com/revisions/9746359/2 有关。随着更新的上下文,它归结为更多的个人偏好。我的建议是不要为这些错误留出余地,因为它们很难找到。

    【讨论】:

    • "变量将被正确地限定在全局范围内而不是在全局范围内。"什么???变量被提升到它们所在范围的顶部,但是 function() { var a, b, c; } 仍然具有函数中的变量范围。
    • @Ramesh 是的……没那么多。变量自动在全局范围内结束的唯一时间是未声明时。他在询问声明变量的等效样式 - 不一定将变量放在全局范围内。
    • 像 var a=10;b=15; 赋值时的一个小错误将导致 b 进入全局范围。他的问题最初是 var a;b,c;
    • @Corbin 我认为他指的是偶然的; 而不是, 强制下一个变量进入全局范围(因为它没有var 关键字)。
    • 如果你也分配了它只会导致全局。否则它只会抛出一个未定义的变量错误
    【解决方案4】:

    第二个选项在我的书中更好,因为它不那么多余。现代浏览器和 IDE 可以很容易地找到像您所说的错误。

    这是一个jsFiddle,它显示了会发生什么。在系列中意外插入分号会导致Uncaught ReferenceError。这是一个快速修复和一个更好的语法的小权衡。如果这是您在编写 JavaScript 时必须处理的最严重的错误,那么您将度过美好的一天。

    具有讽刺意味的是,您在第二个示例中出现了拼写错误——a 后面的分号。哎呀。 :)

    编辑:原始海报修正了错字;我留下提及,因为它与原始问题相关。

    【讨论】:

    • 犯了他犯的错误,第一个选项更好:)
    • @Josh Earl 我已经修好了,谢谢。
    【解决方案5】:

    使用 1 个变量对变量进行多重声明有一个好处。

    您将获得较低的缩小脚本。显然,拥有var 声明所需的 4 个字节并没有太大的区别,直到你像 stackoverflow.com 这样的地方。数以百万计的下载 == 仅基于一些额外的 var 声明的传输。

    【讨论】:

    • 像 UglifyJS 这样好的压缩器会自动将连续的 var 语句压缩为一个,从而使这一点毫无意义
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-21
    • 2015-12-06
    • 1970-01-01
    • 1970-01-01
    • 2020-04-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多