0

我试图理解词法范围的概念。据我所知,词法范围不能向后工作。在下面的 javascript 代码中,我在 scope3() 函数中声明了变量“名称”。但我试图在 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();

4

3 回答 3

0

JavaScript 具有name内置属性。因此,当您尝试获取name指向的变量时,您将得到一个空字符串window.name

您需要使用其他东西而不是名称。

于 2016-02-29T06:27:26.700 回答
0

你需要对词法作用域有一个正确的理解,下面是一个简短而直接的例子来解释这个概念和它是如何工作的:

让我们说:

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

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

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

于 2017-02-25T07:43:56.903 回答
0

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

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

希望有帮助,谢谢!

于 2018-12-10T19:12:53.403 回答