函数头部的Javascript变量声明

时间:2011-12-02 03:05:02

标签: javascript

我被告知javascript变量应该在函数中使用之前完成,例如:

function contrived() {
  var myA, myB;

  myA = 10;
  myB = 20;

  return myA + myB;
}

优先选择:

function furtherContrivance() {
  var myA = 10;
  var myB = 20;

  return myA + myB;
}

是这样的吗?那是为什么?

4 个答案:

答案 0 :(得分:2)

这两者之间没有区别。我会选择:

function furtherContrivance() {
  var myA = 10,
      myB = 20;

  return myA + myB;
}

在javascript中被称为single var pattern

您真正需要注意的是在函数的开头定义变量。 javascript中有一个名为variables hoisting的东西,这意味着函数中使用的变量定义“up”在顶部。最好用一个例子来描述:

var x = 'global'; // global (bounded to a global object which is window in browsers)
function func() { 
    alert(x); // undefined (you expected 'global', right?)
    var x = 'local';
    alert(x); // local
}
func();

真正发生的事情被调用(如我所说)variables hoistingx的定义在上面引发),所以上面的代码实际上与:

var x = 'global';
function func() {
    var x; // definition of `x` raised on top (variables hoisting)
    alert(x); // undefined in a local scope
    x = 'local';
    alert(x);
}

javscript解释器的作用是查看函数内部,收集本地定义的变量并将它们置于顶部 - 这可能是您使用single var pattern的一个很好的理由。

答案 1 :(得分:2)

是的,变量声明应该位于函数的顶部:

function foo() {
  var a, b;
}

但是,初始化变量可以是声明的一部分:

function foo() {
  var a = 10, b = 20;
}

在函数顶部声明所有变量的原因是为了避免范围混淆。

以下是错误代码的示例:

function foo() {
  var b;
  for (var i = 0; i < 5; i++) {
    var a;
    a = b = i;
    setTimeout(function(){
      console.log(a, b);
    }, 1000);
  }
}

如果执行代码,它将记录4, 4 5次,而不是计数。这是因为函数充当闭包并引入新范围。在JavaScript中,函数中的任何var声明都在函数的开头执行。

这使得上述错误更加明显:

function foo() {
  var a, b, i;
  for (i = 0; i < 5; i++) {
    a = b = i;
    setTimeout(function(){
      console.log(a, b);
    }, 1000);
  }
}

答案 2 :(得分:0)

在示例中,您绝对不是这样。在像Javascript这样的语言中,它将更多地是开发人员的偏好,但它不会对结果产生任何影响。

答案 3 :(得分:0)

为了便于阅读,它绝对是首选。

但是,Javascript“提升”声明。吊装意味着变量和功能将自动移动到其范围的顶部。这允许您在声明之前执行诸如使用函数之类的事情:

function myScope()
{
   test();

   function test()
   {
      //...
   }
}

这可能会导致一些混淆,特别是如果声明了块范围内的变量。例如:

for(var i in foo)
{
   var e = myFunc();
}

e的声明将被提升到闭包的顶部,e将被初始化为undefined。这允许一些有趣的非直观情况,例如:

if(!foo) //Will not throw reference error because foo is declared already
{
   var foo = {};
}

因此,无论你如何声明你的变量,他们都会“升级”到函数的顶部。

希望这有帮助!