JavaScript代码约定-变量声明

JavaScript代码约定-变量声明,javascript,variables,syntax,coding-style,Javascript,Variables,Syntax,Coding Style,在JavaScript中声明变量的错误较少的方法是什么 var a; var b; var c; 或 jQuery和Dojo使用第二种方法,就代码易读性而言,这是我个人最喜欢的方法,问题是我发现调试起来比较困难 例1: var a, b, c; // oops.. semicolon instead of comma d, e; 例2: 在项目中搜索某个变量时,var比声明变量更突出 编辑:原始示例是错误的,我在复制和粘贴时出错。代码已经更新,很抱歉不方便。在

在JavaScript中声明变量的错误较少的方法是什么

var a;
var b;
var c;

jQuery和Dojo使用第二种方法,就代码易读性而言,这是我个人最喜欢的方法,问题是我发现调试起来比较困难

例1:

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

在项目中搜索某个变量时,
var
比声明变量更突出


编辑:原始示例是错误的,我在复制和粘贴时出错。代码已经更新,很抱歉不方便。

在我的书中,第二个选项更好,因为它的冗余更少。现代浏览器和IDE使得找到像你所说的那样的bug变得非常容易

这里有一个例子来说明发生了什么。在序列中意外插入分号会导致
未捕获引用错误
。这是一个快速修复和一个更好语法的小折衷。如果这是您在编写JavaScript时必须处理的最严重的bug,那么您将度过美好的一天

具有讽刺意味的是,您在第二个示例中有一个输入错误,
a
后面有一个分号。哎呀!)


编辑:原创海报固定排版;我之所以不提这个问题,是因为它与原始问题相关。

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

  • JSLint和其他可能的linter会抱怨每个范围有多个
    var
    关键字
  • 由于显而易见的原因,单个
    var
    关键字比多个关键字更容易缩小
  • 组合声明迫使您在一个位置声明变量,可能靠近它们所在的函数的开头,这被认为是良好的做法
另一方面,正如您所提到的,组合变量声明可能会出现错误,并且它们可能会在差异中笨拙地表示

只要在整个项目中保持变量声明的一致样式,您选择的样式就不应该真正重要

var a;
var b;
var c;

是更好的方法,因为它不会抛出未定义的错误。此外,变量的作用域将正确&不在全局范围内

var a=10;
    b=5;
将导致b在全局范围内

var a=10;
    b=5;

编辑:这与最初发布的示例是一致的。随着环境的更新,更多的是个人偏好。我的建议是不要给这些错误留余地,因为很难找到它们。

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

var a = 0,
    b = 0,
    c = {},
    d = [],
    f = "";
我在这里提供了一个实际值,如果我在这里提供了一个值。如果不是,我提供以下虚拟值:

  • 0
    用于数字类型
  • 阵列的
    []
  • 对象文本和DOM节点的
    {}
  • 字符串的
    “”
  • function(){return;}
    用于函数
  • 布尔值的
    false
  • 为此,我不担心为Math、Date或RegExp类型预先分配类型

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


您可以使用更小的脚本。显然,在您的应用程序访问stackoverflow.com之前,具有
var
声明所需的4个字节并没有多大区别。数以百万计的下载量==仅基于几个额外的
var
声明的传输量。

您的意思是使用分号而不是逗号吗?这会在Safari中抛出未定义的变量错误。@JeffreySweeney您运行代码时有错误吗?逗号很好用。这个问题的答案是主观的@amnotiam您确定哪种方法更容易出错是主观的吗?我找不到为什么多个声明容易出错的任何原因。组合声明在客观上似乎更容易出错。@amnotiam同意,它似乎回答了自己的问题,并且可能是NARQ因为这个原因…他犯的错误,第一个选择更好:)@Josh Earl我已经修复了它,谢谢。“变量的范围将正确,而不是在全局范围内。”什么???变量被提升到其作用域的顶部,但函数(){var a,b,c;}仍具有与函数中相同的变量作用域。@Ramesh Yeah。。。没有那么多。变量在全局范围内自动结束的唯一时间是它未声明的时间。他在询问关于声明变量的等效样式——这两种样式都不一定把变量放在全局范围内;b=15;将导致b进入全局范围。他的问题最初有一个var a;b、 c@科尔宾:我想他指的是意外的
而不是
强制下一个变量进入全局范围(因为它没有
var
关键字)。只有同时赋值时,才会产生全局变量。否则它只会抛出一个未定义的变量error,这似乎是一个很好的解决方案,它还可以防止弱类型相关的bug。最新的口译员喜欢严格的打字,因此我不得不改变我的行为和风格,以适应这种新的非官方的专业质量编码要求。为什么
function(){return;}
<代码>函数(){}也会做同样的事情。很高兴知道这可以明显提高性能。另一方面,能够判断变量是否已定义通常是有用的(包括在调试中),如果您在开始时为其赋值,这是不可能的。像UglifyJS这样的好的缩小器会自动将连续的var语句压缩为一个,从而使该点变得毫无意义