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

Javascript 在顶部定义每个变量总是最好的方法吗?,javascript,variables,Javascript,Variables,我听说在函数顶部定义变量是一种很好的技术,这样就不会出现变量提升问题。这: // Beginning of file function something(){ var a, b, c = 1, d, e; // Do something } // End of file 是一个很好的例子(当然,不包括坏的变量名) 我的问题是:这总是最好的方法吗?如果您处理的变量很多,该怎么办?它们真的应该放在一行上吗?这是一个风格问题。这不是一个功能性问题 javascript解析器将接

我听说在函数顶部定义变量是一种很好的技术,这样就不会出现变量提升问题。这:

// Beginning of file

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

// End of file
是一个很好的例子(当然,不包括坏的变量名)


我的问题是:这总是最好的方法吗?如果您处理的变量很多,该怎么办?它们真的应该放在一行上吗?

这是一个风格问题。这不是一个功能性问题

javascript解析器将接受此代码

function() {
   dostuff();
   var i = 4;
}
并将其转化为:

function() {
   var i;
   dostuff();
   i = 4;
}
至于风格问题。不,谢谢,我以为我们把它忘在ANSI C上了

您要做的是在函数的“作用域”顶部声明函数

如果变量的“作用域”是整个函数,则在顶部声明它们。如果“范围”是函数的子集,则在子集的开头声明它们

将“范围”视为逻辑范围,而不是功能范围


这将确保最大的可读性。

我敢说,在较旧的结构(如C\C++时代)中,初始化变量并为其分配一个起始值是很重要的。但随着事情的发展,我发现在“必要时”声明它们是一个有效的实现。除非作用域起了作用(例如,您不仅在该函数中需要变量
a
,而且在其他函数中也需要变量
),否则我会立即声明

也许这只是一种思维方式,但我倾向于根据作用域进行声明(如果变量只在If条件或几行代码中需要,我会在那里声明它(而不是在我的函数/类的顶部)。如果我不通过该代码路径,我会认为它是在保存内存分配,并且不会为“没有理由”。)


但是,我可能完全错了。无论如何,JavaScript都允许您以任何您认为最容易阅读的方式声明变量。

这实际上只是一个偏好问题。例如,如果我的方法只包含For循环,那么我不会将循环变量提取到顶部:

var func = function(arr) {
    for (var i = 0, len = arr.length; i < len; i++) {
        // array processing here
    }
}
var func=函数(arr){
对于(变量i=0,len=arr.length;i

几乎所有其他时间,虽然我会把所有的变量放在顶端,因为你的函数顶部有太多的变量,这可能是你的方法做了太多的工作,并且应该考虑把它的一部分提取成某种帮助方法。基于功能的变量。

在具有块作用域的语言中,通常建议在首次使用时声明变量

但是因为JavaScript没有块作用域,所以在函数顶部声明函数的所有变量更明智。这样你就不会在变量的作用域上欺骗自己或其他人

编辑:许多人同时使用多种语言。通常JavaScript是其中唯一没有块作用域的语言。

“它们真的应该全部放在一行上吗?” 我不这么认为。

下面是我如何写的(忽略姓名):

这在上面看起来很愚蠢,因为1)名称很糟糕2)变量没有在“声明”中赋值——大多数代码都可以使用不可变(赋值一次)变量编写,我发现这可以简化代码。我使用它有多种原因,包括清晰性和不易更改格式(也就是说,我可以更改初始值、添加/或删除声明等,而不会影响其他行的格式)

“在顶部定义每个变量始终是最好的方法吗?” 我不这么认为。

例如,我是如何编写循环的:

for (var i = 0; i < x; i++) {
  var elm = elms[i];
  ...
}
for(变量i=0;i
有些人会说“但是VAR被提升到了函数的顶部!”或者“变量是函数范围的!”。的确如此。但是,这让我很容易直观地看到这是一个错误,即使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);
for(变量i=0;i
就我分配给闭包中捕获的变量而言:这取决于。如果该变量仅用于单个闭包,我通常将其放在正上方。这让我知道它只应用于该闭包。如果该变量是共享的(例如
self
),我将其放在所有适用闭包的上方——通常在“函数的变量声明部分。这让我知道它有一个“函数范围”(读:可能在多个绑定中使用)

要解决“for each closure issues”--只需学习语言。将变量“声明”放在闭包附近无论如何都不会影响这一点。如果不理解构造,那么代码的编写方式就无关紧要了

我使用这些方法是因为:

  • 具有一致的易于扫描的代码
  • 编写代码,告诉我何时出错
  • 我更喜欢可以修改而不改变结构的代码
  • 自文档化代码意味着更少的注释
  • 我喜欢“垂直阅读”
  • 愉快的编码。

    我强烈建议进行阅读。他的论点是,您既不应该在一行中声明所有变量,也不应该在例程的顶部声明所有变量。因此,不要这样做:

    function foo() {
        var a,
            b,
            c,
            d;
    
         /**
          * 20 lines that use a and b
          */
    
         /**
          * 10 lines that use c and d
          */
    }
    
    相反,您应该在需要变量的位置附近声明变量。在上面的代码中,这可能如下所示:

    function foo() {
        var a,
            b;
    
         /**
          * 20 lines that use a and b
          */
    
         var c,
             d;
    
         /**
          * 10 lines that use c and d
          */
    }
    
    其好处是,只需查看代码块上方的声明,您就可以快速了解代码块使用了哪些变量
    function foo() {
        var a,
            b;
    
         /**
          * 20 lines that use a and b
          */
    
         var c,
             d;
    
         /**
          * 10 lines that use c and d
          */
    }