Javascript词汇范围

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Javascript词汇范围相关的知识,希望对你有一定的参考价值。

我试图理解词汇范围的概念。据我所知,词汇范围不会倒退。在下面的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有name内置属性。所以,当你试图获得name变量时,你会得到一个空字符串,因为它指向window.name

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

另一答案

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

让我们说:

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

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

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

另一答案

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

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

希望有所帮助,谢谢!

以上是关于Javascript词汇范围的主要内容,如果未能解决你的问题,请参考以下文章

保留对附加节点 javascript 的引用

VSCode自定义代码片段12——JavaScript的Promise对象

VSCode自定义代码片段12——JavaScript的Promise对象

快速掌握ECMAScript 6中的let语法

30秒就能看懂的JavaScript 代码片段

常用Javascript代码片段集锦