2

我测试了以下代码:

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

它返回“布尔值”。只有当我评论第二行时:

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

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

4

1 回答 1

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 有奇怪的暗角......)

于 2013-02-02T18:30:42.277 回答