在顶部定义每个变量总是最好的方法吗?

Chr*_*nte 26 javascript variables

我听说在函数顶部定义变量是一种很好的技术,因此最终不会出现可变的提升问题.这个:

// Beginning of file

function something(){
    var a, b, c = 1, d, e;
    // Do something
}

// End of file
Run Code Online (Sandbox Code Playgroud)

是一个很好的例子(当然不包括坏的变量名).

我的问题是:这总是最好的方法吗?如果你正在使用很多变量怎么办?他们真的应该只是在一条线上吗?

irc*_*ell 49

我强烈建议让Steve McConnell阅读Code Complete 2.他的论点是你既不应该在一行中声明所有变量,也不应该在例程的顶部声明它们.所以,不要这样做:

function foo() {
    var a,
        b,
        c,
        d;

     /**
      * 20 lines that use a and b
      */

     /**
      * 10 lines that use c and d
      */
}
Run Code Online (Sandbox Code Playgroud)

相反,您应该将变量声明为接近需要的位置.在上面的代码中,可能如下所示:

function foo() {
    var a,
        b;

     /**
      * 20 lines that use a and b
      */

     var c,
         d;

     /**
      * 10 lines that use c and d
      */
}
Run Code Online (Sandbox Code Playgroud)

好处是,只需查看上面的声明,您就可以快速了解一段代码所使用的变量.您不需要读取代码来查看设置了哪些变量,只是声明了哪些变量.

不要为编译器或计算机编写代码.写给开发人员.您的代码应尽可能易于阅读,并且需要尽可能少的努力来理解特定的代码段.

  • 我一直在使用JavaScript模式:http://oreilly.com/catalog/9780596806767.那本书给了我把变量声明放在函数顶部的想法.说出你对这个建议的要求,但本书的其余部分一直很出色. (2认同)

小智 29

"他们真的应该只是在一条线上吗?"

我不这么认为.

这是我写的方式(忽略名称):

function something(){
    var a,
        b,
        c = 1,
        d,
        e;
    // Do something
}
Run Code Online (Sandbox Code Playgroud)

这只是在上面看起来很愚蠢因为1)名称很糟糕2)变量没有在"声明"中分配 - 大多数代码可以用不可变(一次分配)变量编写,我发现这是为了简化代码.我使用它有多种原因,包括清晰度和格式化更改的阻力(也就是说,我可以更改初始值,添加/或删除声明等,而不会弄乱其他行的格式).

"在顶部定义每个变量总是最好的方法吗?"

我不这么认为.

例如,以下是我编写循环的方法:

for (var i = 0; i < x; i++) {
  var elm = elms[i];
  ...
}
Run Code Online (Sandbox Code Playgroud)

而且有些人会说"但是这些功能已经被提升到了最重要的位置!" 或者"变量是功能性的!".嗯,的确如此.但是,这使我可以轻松地直观地看到这是一个错误,即使JavaScript引擎无法帮助:

for (var i = 0; i < x; i++) {
  var elm = elms[i];
  ...
}
...
// valid JS but since I consider this construct *invalid*
// I know this is a *bug* in my code
alert(elm);
Run Code Online (Sandbox Code Playgroud)

至于我分配给闭包中捕获的变量时:它取决于.如果变量仅在一个闭包中使用,我通常将它放在正上方.这让我知道它应该只用在那个闭包中.如果变量是共享的(例如self),我将它放在所有适用的闭包之上 - 通常在函数的"变量声明部分"中.这让我知道它有一个"功能范围"(读取:可能用于多个绑定).

要解决"for-each-closure"问题 - 只需学习语言即可.保持变量"声明"接近闭包不会影响到这一点.如果结构不被理解,这其实并不重要,如何代码编写.

我使用这些方法/因为:

  1. 拥有一致易于扫描的代码.
  2. 编写代码,告诉我何时出错.
  3. 我更喜欢可以修改的代码而不改变结构.
  4. 自我记录代码意味着更少的评论.
  5. 我喜欢"垂直阅读"

快乐的编码.

  • 使用半列!我的眼睛.他们流血了. (19认同)
  • 半柱是否仅使其位于天花板的中途? (8认同)

Ole*_*liv 14

在具有块范围的语言中,通常建议在首次使用的站点声明变量.

但是因为JavaScript没有块范围,所以在函数顶部声明所有函数的变量是明智的.这样你就不会欺骗自己或其他人关于变量的范围.

编辑:许多人同时使用多种语言.JavaScript通常是没有块范围的唯一一个.

  • 任何认为javascript具有块范围的人都不应该触及javascript代码. (4认同)
  • 我同意雷诺斯的观点.虽然这在技术上是正确的*,但将所有变量放在函数顶部*会降低*代码自我记录的能力. (4认同)
  • JavaScript现在使用[`let`关键字]来阻止脚本(http://www.ecma-international.org/ecma-262/6.0/#sec-let-and-const-declarations).请注意,如果您需要[向后兼容性](http://caniuse.com/#feat=let),则不建议使用此功能. (3认同)

Ray*_*nos 8

这是一个风格问题.不是功能问题.

javascript解析器将采用此代码

function() {
   dostuff();
   var i = 4;
}
Run Code Online (Sandbox Code Playgroud)

并把它变成:

function() {
   var i;
   dostuff();
   i = 4;
}
Run Code Online (Sandbox Code Playgroud)

至于风格问题.不,谢谢,我以为我们用ANSI C留下了它.

你想要做的是在"范围"的顶部声明函数

如果变量的"范围"是整个函数,则在顶部声明它们.如果"范围"是函数的子集,则在子集的开头声明它们.

将"范围"视为逻辑范围而不是功能范围.

这应该确保最大的可读性.

  • 但是,如果您没有预料到,将变量"提升"到函数顶部的行为可以改变代码的功能.在函数顶部定义每个变量旨在帮助您避免遇到这些问题. (2认同)
  • @SimpleCoder在可读性方面将变量声明在其范围的最高点.你知道javascript只有函数范围吗? (2认同)