Javascript 变量声明在函数声明之前有任何优先级吗?

Javascript 变量声明在函数声明之前有任何优先级吗?,javascript,Javascript,我测试了以下代码: (function(){ var x = false; function x(){ return true; } return typeof x; })(); 它返回“boolean”。只有在我评论第二行时: (function(){ //var x = false; function x(){ return true; } return typeof x; })(); 它返回“函数”。 这意味着如果有人以前

我测试了以下代码:

(function(){
  var x = false;  
  function x(){
    return true;
  }  
  return typeof x;
})();
它返回“boolean”。只有在我评论第二行时:

(function(){
  //var x = false;  
  function x(){
    return true;
  }  
  return typeof x;
})();
它返回“函数”。 这意味着如果有人以前在代码中的某个地方声明过变量,我使用相同名称的函数声明将失败,对吗?请有人给我解释一下。
谢谢

在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有一些奇怪的暗角…

在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有一些奇怪的暗角…

我希望函数声明能转化为先编写的函数表达式赋值?即代码被视为
var x;x=函数x(){…};x=假@Bergi我想JavaScript引擎可以自由地这样做,但这两个引擎并不完全相同。
函数
和形式参数的开括号之间的函数实例化中提供的名称为函数中的代码绑定,与封闭范围中的符号无关。这有点像Lisp中的
letrec
。(不过,我不知道是否有可能构建一个例子来说明两者之间的区别。)@Pointy:我使用NFE就是为了这个原因?或者你是说更专业的东西?@Pointy,你知道Lisp吗?我一直在想,我是否应该在JavaScript之前先学习Lisp,以便更好地理解函数式编程。你怎么认为?虽然我已经尝试过一些Lisp和Scheme,但它似乎与C类语言有很大不同,但很有趣。@paperstreet7我只能说我熟悉Lisp;我从未在严肃的项目中使用过它。如果你想使用现代的Lisp-ish语言,Clojure真的很酷。我希望函数声明能转化为先编写的函数表达式赋值?即代码被视为
var x;x=函数x(){…};x=假@Bergi我想JavaScript引擎可以自由地这样做,但这两个引擎并不完全相同。
函数
和形式参数的开括号之间的函数实例化中提供的名称为函数中的代码绑定,与封闭范围中的符号无关。这有点像Lisp中的
letrec
。(不过,我不知道是否有可能构建一个例子来说明两者之间的区别。)@Pointy:我使用NFE就是为了这个原因?或者你是说更专业的东西?@Pointy,你知道Lisp吗?我一直在想,我是否应该在JavaScript之前先学习Lisp,以便更好地理解函数式编程。你怎么认为?虽然我已经尝试过一些Lisp和Scheme,但它似乎与C类语言有很大不同,但很有趣。@paperstreet7我只能说我熟悉Lisp;我从未在严肃的项目中使用过它。如果你想使用现代的Lisp语言,Clojure真的很酷。