为什么外部作用域变量不能正确地绑定到内部变量?

Why doesn't the outer scope variable get properly bound to the inner variable?

本文关键字:变量 内部 绑定 不能 外部 作用域 为什么 正确地      更新时间:2023-09-26
(function(){
  var x = 23;
  return function(){
    var x = x;
    return x;
  }
}())();

为什么返回undefined而不是23?

var x = x;部分是足够明确的,因为右边隐含地指的是外部作用域中的x ?

语句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;
}())();

var x = x;部分是足够明确的,因为右边隐含地指的是外部作用域中的x ?

。在执行任何赋值之前,所有变量的作用域都是确定的。

有一个概念叫做可变提升。简而言之,在执行函数之前,所有在函数内部声明的变量都将被标记为未定义。所以它返回undefined。由于变量提升,您可以稍后定义变量,但可以在…如。function(){alert(x);var x;}将警告未定义,但当function(){alert(x);}抛出错误…

给定:

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

内部函数只看到内部x

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

解析标识符时,首先检查变量对象,只有在没有找到时才检查作用域链。