5

在 Stefanov 的《JS 设计模式》一书中,他写道“你使用一个 var 语句并声明多个以逗号分隔的变量”,然后给出了“单个 var”模式的示例,如下所示:

function func() {
    var a = 1,
        b = 2,
        sum = a + b,
        myobject = {},
        i,
        j;

Stefanov 还写道:

  • “在声明变量时也使用初始值初始化变量是一个很好的做法。”
  • “你也可以在声明的时候做一些实际的工作,比如前面代码中 sum = a + b 的情况。”

现在我有一些代码如下,用单个 var 模式声明相同数量的变量,但做了很多“声明时的实际工作”:

var html = '{purchaseQty}<br>FR:&nbsp; {fromLoc}'
    ,tpl = new Ext.XTemplate(html)
    ,srcReqLoc = record.get('SRC_REQUEST_LOC').trim()
    ,srcSupLoc = record.get('SRC_SUP_LOC').trim()
    ,fromLoc = srcReqLoc ? srcReqLoc : srcSupLoc
    ,tplCfg = {
        purchaseQty: purchaseQty
        ,fromLoc: fromLoc
    };

做太多“申报时的实际工作”有什么坏处?顺便说一句,我不认为这是Javascript 单一 var 模式的完全重复。我超载了吗?因为我问的是一般的缺点,而不是我的代码可能有什么问题。

我想我可以看到一个普遍的缺点是无法检查错误,例如在我的示例中,我在从 record.get 预期返回的字符串上调用 trim(),但如果返回 undefined,则“无法调用方法在未定义的对象上”(或任何它是;)将被抛出。有人能想到别的吗?

4

3 回答 3

6

我个人支持 Douglas Crockford(尽管我很欣赏那些不同意这一点的人),在函数顶部声明 var 最有意义,因为 JavaScript 没有块作用域。

JSLint 网站

在具有块范围的语言中,通常建议在第一次使用的地方声明变量。但是因为 JavaScript 没有块作用域,所以在函数顶部声明函数的所有变量更为明智。建议每个函数使用单个 var 语句。

唯一的缺点是您的代码对于来自 C 或基于 C 的背景的人来说可读性较差。

我担心我在这里听起来可能像 Crockford 的粉丝,但我推荐这个关于编码风格的演讲,以及为什么有时你的大脑应该用代码结构来统治你的心(取决于语言)。

于 2011-12-20T21:01:29.107 回答
5

在作用域的顶部声明所有变量是有意义的,即在函数的开头或全局代码的开头。我同意这一点。

至于在声明时提供初始值,我认为这更像是一个指导方针。一般来说,这一个很好的计划,当然适用于简单的值,但有时在一些更复杂的计算之后才知道初始值 - 在这种情况下,我不会提供一个永远不会被使用的默认值,只是为了提供一些价值。有时它变得太乱了。

此外,我不会在声明时给循环索引变量一个初始值 - 对我来说,在循环开始时分配值要清楚得多。

正如您已经指出的那样,如果您需要处理异常等,您也需要稍后在函数中执行此操作。

只需使用一些常识:如果您有很多变量,您可能会发现您的var语句有点不可读,因此您可以将一些初始化移到函数的后面。

对我来说,您的示例代码是可以的,但是如果您需要添加更多内容,它会有点难以阅读,因为在密集块中有这么多代码,我无法轻松地挑选出变量名,但是 - 和显然,这是一个口味问题 - 您可以添加一些空格:

var html       = '{purchaseQty}<br>FR:&nbsp; {fromLoc}'
    ,tpl       = new Ext.XTemplate(html)

    ,srcReqLoc = record.get('SRC_REQUEST_LOC').trim()
    ,srcSupLoc = record.get('SRC_SUP_LOC').trim()    
    ,fromLoc   = srcReqLoc ? srcReqLoc : srcSupLoc

    ,tplCfg    = {
        purchaseQty: purchaseQty
        ,fromLoc: fromLoc
    };

(将=符号排成一行,或用空行对相关变量进行分组,或两者兼而有之。)

于 2011-12-20T21:47:01.140 回答
1

由于这已经很老了,并且不再完全相关,因此向来自 es6 世界的人们指出我们现在有块作用域是很有用的。

无论如何,提升都会将所有 var 声明的变量放在函数范围的顶部,但有时您会在编写代码时意识到变量仅在某个块中使用 - 在这种情况下,let 是首选 - 甚至变量不会更改引用在这种情况下, const 是最好的主意。

于 2017-08-08T12:43:07.043 回答