Javascript词汇范围

问题描述 投票:0回答:3

我试图理解词汇范围的概念。据我所知,词汇范围不会倒退。在下面的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 scope lexical-scope lexical-closures
3个回答
0
投票

JavaScript有name内置属性。所以,当你试图获得name变量时,你会得到一个空字符串,因为它指向window.name

你需要使用别的东西而不是名字。


0
投票

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

让我们说:

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

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

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


0
投票

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

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

希望有所帮助,谢谢!

© www.soinside.com 2019 - 2024. All rights reserved.