Javascript 词法范围

Javascript Lexical scope

我正在尝试理解词法作用域的概念。据我所知,词法作用域不能反向工作。在下面的 javascript 代码中,我在 scope3() 函数中声明了变量 'name'。但我试图在 scope1() 和 scope2() 函数中调用它。由于词法作用域不能反向工作,我应该得到 "name is undefined" 但它 returns 是空字符串。有人可以解释一下吗?

var scope1 = function () {
  // name should have been undefined but its printing empty string
  console.log(name);
  var scope2 = function () {
    // name should have been undefined but its printing empty string
    console.log(name);
    var scope3 = function () {
      var name = 'Todd'; // locally scoped
    };
  };
  scope2();
};
scope1();

JavaScript 具有 name 内置 属性。因此,当您尝试获取指向 window.name.

name 变量时,您将得到一个空字符串

您需要使用其他名称代替名称。

您需要对词法作用域有一个正确的理解,下面是一个简短而直接的例子来解释这个概念及其工作原理:

让我们说:

function(auto) {
   var vehicle = "bus";
   console.log(vehicle);

   function(innerAuto) {
     console.log(vehicle)
   }
   innerAuto();
}
auto();

所以在这个上下文中调用 innerAuto 的内部函数得到一条指令来记录 vehicle 的值,它无处可寻,函数立即知道它应该去外部范围找到它。即 JS 运行时已经知道,在执行此代码时,无需在 innerAuto 函数内部查看变量 vehicle 的声明。所以你想知道它是怎么知道的?这是因为在编译时它没有在 innerAuto 函数中看到变量声明,而是在 auto 函数中看到它。所以词法范围只是编译时间范围。有关更多信息,请查看 MDN 有关词法作用域和闭包的文档。

name 是依赖于实现的 JavaScript 对象的预定义名称列表的一部分。因此,它不会提供您期望的参考错误。将绑定 name 更改为 names 以查看预期的引用错误。

您对词法作用域的逻辑理解也完全正确。词法(或静态)范围,为函数(或块)提供查看其父函数(或块)的绑定。但是,父函数(或块)没有在其子函数中创建的绑定的视图。另一方面,全局绑定对所有人可见。

希望对您有所帮助,谢谢!