代码之家  ›  专栏  ›  技术社区  ›  Scott McKenzie

在javascript中每个函数一个变量?

  •  51
  • Scott McKenzie  · 技术社区  · 15 年前

    我一直在使用jslint让我对我的javascript感到不好。顺便说一下,这很好。有一张支票我不太明白,我想听听你的意见。

    jslint.com :

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

    最后一句粗体的句子是什么?我想我应该声明这样的多个变量?

    var foo = 1, bar = 2;
    

    而且,“明智的”部分仅仅是一种阻止错误的编程风格,还是有更多的内容?

    谢谢你的帮助。

    4 回复  |  直到 11 年前
        1
  •  72
  •   Breton    11 年前

    问题是,无论您是否意识到,javascript都会无形地将所有var声明移动到函数范围的顶部。

    所以如果你有这样的功能

    var i = 5;
    function testvar () {
         alert(i);
         var i=3;
    }
    testvar();
    

    警报窗口将包含未定义的。因为在内部,它被改为:

    var i = 5;
    function testvar () {
         var i;
         alert(i);
         i=3;
    }
    testvar();
    

    这叫做“吊装”。 Crockford如此强烈地提倡将var声明放在首位的原因是,它使代码明显地匹配它将要做的事情,而不是允许发生不可见和意外的行为。

        2
  •  8
  •   Christian C. Salvadó    15 年前

    基本上是在javascript块中( { ... } )不要引入新的作用域,因为只有函数作用域,所以不会在任何其他语句上创建作用域。

    在函数的任何地方引入的变量在函数的任何地方都可见。

    例如:

    function myFunction(){
      var one = 1;
    
      if (one){
        var two = one + 1;
      }
    
      (function () {
        var three = one + two;
      })();
    
      // at this point both variables *one* and *two* are accessible but 
      // the variable *three* was declared in the scope of a inner function
      // and is not accessible  at this point.
    }
    

    在具有块范围的语言中,建议在第一次使用时声明变量,但由于javascript没有块范围,因此最好在函数顶部声明函数的所有变量。

    检查这个 article .

        3
  •  6
  •   Kenan Banks    15 年前

    缺少块范围解释了以下代码:

    var a = 1;
    if (something) {
        var a = 2;
    }
    
    alert(a); // Alerts "2"
    

    在大多数C样式(如语法)语言中, var a = 2 定义将只为 if 块。在函数顶部使用一个VAR语句有助于避免JavaScript的这种怪癖,它并不总是像上面那样明显,对C/C/Java程序员来说是意外的。

        4
  •  4
  •   Chetan S    15 年前

    是的,这意味着在函数的开头声明所有变量。无论您是想在一行还是多行中进行,这都是一个选择。

    你提到的段落解释了原因。javascript变量只有函数级作用域。如果在if/while/for块中声明相同的变量,则该变量将被新值覆盖,因为该块不具有新的作用域。这与Java等语言不同。为了避免这样的意外,请在函数开始时声明要在函数中使用的所有变量,这样您就不会意外地“重新声明”和ything。