Javascript"单一var模式"的缺点

Geo*_*pty 5 javascript design-patterns declaration variable-assignment variable-declaration

在Stefanov的JS Design Patterns一书中,他写道"你使用一个var语句并声明用逗号分隔的多个变量",然后给出一个"single var"模式的例子,如下所示:

function func() {
    var a = 1,
        b = 2,
        sum = a + b,
        myobject = {},
        i,
        j;
Run Code Online (Sandbox Code Playgroud)

斯特凡诺夫还写道:

  • "在您声明变量时,也可以使用初始值初始化变量,这是一个很好的做法."
  • "您还可以在声明时进行一些实际工作,例如前面代码中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
    };
Run Code Online (Sandbox Code Playgroud)

做太多"宣布时的实际工作"有什么缺点?顺便说一下,我不认为这是Javascript单一var模式的完全重复.我超载了吗?因为我问的是一般的缺点,而不仅仅是我的代码可能出错.

我想我可以看到一般的缺点是无法检查错误,例如在我的例子中我在从record.get预期返回的字符串上调用trim(),但如果返回undefined,则"无法调用方法"在未定义的对象上"(或者它是什么;)将被抛出.任何人都可以想到其他什么吗?

isN*_*247 6

我个人支持道格拉斯·克罗克福德(尽管我很欣赏那些不支持这一点的人),在函数顶部声明变量最有意义,因为JavaScript没有块范围.

来自JSLint站点:

在具有块范围的语言中,通常建议在首次使用的站点声明变量.但是因为JavaScript没有块范围,所以在函数顶部声明所有函数的变量是明智的.建议每个函数使用一个var语句.

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

我很谨慎,我可能听起来像这里的Crockford粉丝,但我建议这个关于编码风格的讨论,为什么有时候你的大脑应该通过代码结构(取决于语言)统治你的心脏.

  • +1提及"JavaScript,编程风格和你的大脑".我喜欢那个话题:-) (2认同)

nnn*_*nnn 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
    };
Run Code Online (Sandbox Code Playgroud)

(将=符号对齐,或将相关变量与空行或两者组合在一起.)