为什么外部范围变量没有正确绑定到内部变量?

时间:2014-06-16 12:06:37

标签: javascript scope

(function(){
  var x = 23;
  return function(){
    var x = x;
    return x;
  }
}())();

为什么它返回undefined而不是23?

不应该是var x = x;部分是否足够明确,因为右侧隐含地引用了外部范围中的x?

4 个答案:

答案 0 :(得分:2)

声明var x = x;没有看到外部作用域中的变量x。范围内的变量x在赋值之前已经存在,并且从外部范围隐藏变量。

范围内的所有变量都是在范围内的代码执行(提升)之前创建的,因此它与您拥有的相同:

(function(){
  var x;
  x = 23;
  return function(){
    var x;
    x = x;
    return x;
  }
}())();

在声明变量的范围内,实际上并不重要。你可以在代码中最后声明它们(虽然这会有点令人困惑),代码仍然有效:

(function(){
  x = 23;
  return function(){
    x = x;
    return x;
    var x;
  }
  var x;
}())();

答案 1 :(得分:1)

  

var x = x不应该;部分是否足够明确,因为右侧隐含地引用了外部范围中的x?

没有。在执行任何分配之前确定变量的所有范围。

答案 2 :(得分:0)

有一个名为变量提升的概念..简而言之,就在执行函数之前,所有在函数内声明的变量都将被标记为undefined。因此它返回undefined ..由于变量提升,您可以稍后定义变量,但可以在之前使用它...例如。 function(){alert(x);var x;}将警告未定义,但function(){alert(x);}会在哪里引发错误..

答案 3 :(得分:0)

假设:

(function(){
  var x = 23;
  return function(){
    var x = x;
    return x;
  }
}())();

内部函数只能看到内部 x

当输入执行上下文时,所有声明的变量都会被初始化,给定值 undefined 并在执行任何代码之前放置在一种变量对象上(例如赋值)。所有外部变量都放在范围链上。

在解析标识符时,首先检查变量对象,并且只有在未找到的情况下才会检查范围链。