Javascript 词汇范围

Javascript Lexical scope

本文关键字:范围 词汇 Javascript      更新时间:2023-09-26

我试图理解词汇范围的概念。据我所知,词汇范围不能向后工作。在下面的javascript代码中,我在scope3()函数中声明了变量"name"。但我尝试在 scope1() 和 scope2() 函数中调用它。由于词法范围不能向后工作,我应该得到"名称未定义",但它返回空字符串。有人可以解释一下吗?

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 具有名称内置属性。因此,当您尝试获取指向window.name的变量时name您将获得一个空字符串。

您需要使用其他内容而不是名称。

您需要正确理解词汇范围,下面是一个简短而直接的示例来解释该概念及其工作原理:

比方说:

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

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

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

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

希望有帮助,谢谢!