变量声明在函数声明之前是否有任何优先权?

时间:2013-02-02 18:28:24

标签: javascript

我测试了以下代码:

(function(){
  var x = false;  
  function x(){
    return true;
  }  
  return typeof x;
})();

返回“boolean”。只有当我评论第二行时:

(function(){
  //var x = false;  
  function x(){
    return true;
  }  
  return typeof x;
})();

返回“功能”。 这意味着如果有人在之前的代码中某处声明了变量,那么使用相同名称的函数声明将失败,对吧?请有人向我解释一下。 谢谢!

1 个答案:

答案 0 :(得分:4)

在JavaScript中,函数声明被视为首先编写它们。然后是变量声明。 (如果有的话,这种特殊的排序很少发生。)

在变量声明中,任何赋值部分都被视为单独的表达式语句,该语句出现在函数中var语句实际出现的位置。因此:

function foo() {
  // ... some code ...
  if (whatever) {
    var x = whatever + 1;
  }
}

被视为:

function foo() {
  var x;
  // ... some code ...
  if (whatever) {
    x = whatever + 1;
  }
}

因此总的来说,您的第一个样本被视为:

(function() {
  function x() {
    return true;
  }
  var x;
  x = false;
  return typeof x;
})();

另请注意,函数和变量共享一个公共命名空间。对于已经声明的变量名称没有赋值部分的var声明无效。 (至少,我认为它没有任何有意义的影响,但JavaScript有奇怪的黑暗角落......)