Javascript词汇范围

时间:2016-02-29 06:24:55

标签: javascript scope lexical-scope lexical-closures

我试图理解词汇范围的概念。据我所知,词汇范围不会倒退。在下面的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();

3 个答案:

答案 0 :(得分:0)

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

你需要使用其他东西而不是名字。

答案 1 :(得分:0)

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

让我们说:

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

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

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

答案 2 :(得分:0)

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

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

希望能有所帮助,谢谢!