JavaScript 中的词法范围

2023-11-21

我对 JavaScript 中的作用域到底是如何工作的感到有点困惑,主要是词法作用域。我知道全局作用域中的变量可以在任何地方访问,在 JavaScript 中创建新作用域的唯一方法是通过创建函数(或在 ES6 中使用 let )。但是,我不太明白词法范围是什么/意味着什么。我查遍了互联网,找不到明确的解释。

我觉得我开始理解它了,但请让我与你们 JavaScript 向导确认一下,以确保我是正确的。

因此,根据我的理解,词法作用域意味着静态作用域,因此例如,函数的作用域不是由调用它的位置创建的,而是由函数本身创建的位置创建的。下面的代码演示了这个概念:

var x = "global";

function foo() {
   console.log(x);
}

function bar() {
   var x = "bar";
   foo();
}

function baz() {
   var x = "baz";
   foo();
}


bar();
baz();

打印到控制台的内容是“全局”两次。这是因为当调用函数 foo 时,解释器首先检查 foo 的作用域以查看它是否具有变量“x”,然后检查全局作用域,而不是 bar 或 baz 作用域。变量“x”不是从调用函数 foo 的地方获取的,而是从它创建的地方获取的,因此具有词法作用域。我说得对吗?这有道理吗?

词法作用域的另一个例子是闭包,对吗?例如,内部函数可以访问外部函数的变量,无论由于词法作用域而在何处调用内部函数,对吗?

最后,我的最后一个例子是箭头函数。它们允许“this”的词汇范围,对吧?所以,举例来说,

   var obj = {
       name: "Rob",
       print() {
       setTimeout(() => {
         console.log(this.name)
       }, 1000);
     }
   };

如果“this”是标准内联函数,则“this”不会绑定到全局对象,而是绑定到 obj,因为“this”具有箭头函数的词法作用域。

我说的一切都正确吗?另外,有人能给我一个词法范围的明确定义吗? JavaScript 中还有其他我应该了解的词法作用域示例吗?

Thanks.


要理解词法作用域,您需要对作用域有基本的了解。在 javascript 中,我们将作用域分为三种类型

  1. 功能范围
  2. 块范围
  3. 词汇范围

功能范围-> 函数内部定义的变量被视为在函数作用域内。var关键字用于定义函数范围内的变量。

块作用域-> 在 if、switch 条件、for 和 while 循环内的区域中定义的变量。 每当你看到“{}”大括号时,它就是一个块。在 ES6 中常量和让关键字允许开发人员在块作用域中声明变量。这意味着这些变量仅存在于相应的块中。

   function animal(){
    if(true){
        var animal1 = "cat";
        const animal2 = "dog";
        let animal3 = "rat";
    }
    console.log(animal1);
    console,log(animal2); //animal2 is not defiend
    console,log(animal3); //animal3 is not defiend
}
animal();

result

cat

Animal2 未定义

Animal3 未定义

词汇范围-> 在第一行中我想说“子作用域可以访问父作用域中的变量” `

var outerFunction = function()
{
    if(true){
        var x = 5;
        const y = 10;
    }

    var innerFunction = function(){
        if(true){
            alert(x);
            //alert(y);   //y is not defiend on line 13

        }
    }
    innerFunction();
}
 outerFunction();
 //console.log(x); // x is not defiend on line 20

`。 变量的范围由它们在源代码中的位置定义。 为了解析变量,javascript 从最内部的范围开始向外搜索,直到找到它正在寻找的变量。 词法作用域很好,因为我们可以通过查看代码轻松找出变量的值;而在动态作用域中,变量的含义可以在运行时改变,从而使其变得更加困难

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JavaScript 中的词法范围 的相关文章

随机推荐

  • Ionic 4 发布后安装本机插件时出现 Ionic 3 错误

    当安装 Native Store 成功时 我使用本机插件 ionic 3 遇到问题 但是当我尝试添加应用程序模块时 文本编辑器显示一条红线 当我尝试运行时 我发现了如下错误 这里我安装 Native store https ionicfra
  • AngularJS 和 Rails 路由错误

    我正在关注以下教程 https thinkster io angular rails 当我到达 将前端与资产管道集成 部分时 事情就崩溃了 该网站陷入无限循环并不断产生相同的错误 我已经检查并重新检查了每个步骤 有人可以帮忙吗 Error
  • 在bash中提取不带路径和扩展名的文件基名[重复]

    这个问题在这里已经有答案了 给定如下文件名 the path foo txt bar txt 我希望得到 foo bar 为什么这不起作用 bin bash fullfile 1 fname basename fullfile fbname
  • “grep -q”不以“tail -f”退出

    我正在尝试实现一个等待日志文件中特定消息的脚本 记录消息后 我想继续执行脚本 这是我正在尝试的tail f and grep q tail f logfile grep q Message to continue The grep永远不会退
  • 使用 Reactjs 的 Axios Post 表单

    所以我用 Axios 有这个 post 方法 如果我提交这个 它说 未捕获 承诺 错误 网络错误 在创建错误 createError js 16 在 XMLHttpRequest handleError xhr js 87 如果我使用这个方
  • 壁虎驱动器和木偶之间的区别[重复]

    这个问题在这里已经有答案了 我不完全理解之间的区别壁虎司机 and 木偶 谁能澄清它们之间的区别 例如 当我使用 Selenium WebDriver 来控制 Firefox 浏览器时 我需要一个 geckodriver 二进制文件来监听W
  • 角度分量进入传单弹出窗口

    无法弄清楚如何将组件生成到传单弹出窗口中 我尝试过两件事 首先 将组件选择器集成到 html 中 但看起来 Angular 没有编译它 let my geojson L geoJSON data onEachFeature feature
  • ASP.NET MVC3 Razor - 在回发时保持滚动位置

    对使用 MvcContrib 框架的网格表进行排序后 如何在回发时保持滚动位置 通常的方法是使用一些 javascript 将当前滚动位置设置为隐藏字段 然后在页面加载时恢复该位置 通常在 jquery 就绪事件中 然而 这实际上只是一个副
  • 无法从docker拉取镜像,ProcessUtilityVMImage找不到指定的路径

    我制作了一个 net core 应用程序并将其上传到 docker hub 当我尝试将其拉到我自己的机器上时 win 10 它就可以工作 当我尝试将其拉到服务器 服务器 2016 时 出现错误 docker pull arrivaflg f
  • 如何统计每个类别的商品数量?

    我想对网站上的产品进行过滤 像这样的东西 Department lassics 13 395 Literary 111 399 History 68 606 Format HTML 3 637 PDF 8 Audio CD 443 Lang
  • 根据查询计数

    给定一个包含 N 个正元素的数组 假设我们列出了数组 A 的所有 N N 1 2 个非空连续子数组 然后用相应子数组中存在的最大元素替换所有子数组 所以现在我们有 N N 1 2 个元素 其中每个元素都是其子数组中的最大值 现在我们有 Q
  • 如何右对齐

    标签?

    我有几个 p 我想要右对齐的标签 有谁知道如何做到这一点 CSS p text align right INLINE p p style text align right Some Text p jQuery p css text alig
  • 如何使用 flutter google_maps 插件获取可见地图的边界?

    我试图找出 flutter 的谷歌地图插件中谷歌地图可见部分的边界框是什么 可以获得吗 如果不是 是否可以根据缩放级别和地图中心的纬度 经度来计算边界框 那将是GoogleMapController getVisibleRegion
  • 如何从 Azure DevOps 中的 YAML 管道获取阶段结果

    到目前为止 我正在使用Azure DevOps REST Api从 Azure DevOps 中的版本获取数据以用于报告目的 显然 这将随着使用 CI CD gt YAML 和多阶段管道 当前预览 的新方式而改变 在这种情况下 构建和发布策
  • 分块读取大文件c#

    我想逐块读取非常大的文件 4GBish 我目前正在尝试使用StreamReader和Read 读取方法 语法是 sr Read char buffer int index int count 因为index is an int它会overf
  • 缓存策略,输出缓存与数据缓存或两者兼而有之?

    我正在开发一个 ASP NET MVC 项目 现在我想开始考虑我的缓存策略 我试图让我的框架尽可能开放以供缓存使用 据我在 Scott Hanselman 的播客中听到的消息 StackOverflow com 使用页面输出缓存并压缩该内容
  • Spring Boot 在 Gradle 中获取包的属性

    我正在尝试将我的项目从 Maven 构建转换为 Gradle 目前项目使用Spring Boot 在我当前的 Maven 配置中 我有
  • 如何解决VScode UnsupportedClassVersionError?

    Problem 当我运行 HelloWorld 时 它返回 java lang UnsupportedClassVersionError HelloWorld 已编译 通过更新版本的 Java 运行时 类文件版本 52 65535 该版本的
  • 函数中的自动参数类型

    我想知道标准委员会是否考虑扩展C 14auto关键字来推导函数模板参数类型 就像现在泛型 lambda 中存在的那样 正如这个答案中很好地描述的那样 因为它适用于 lambda 函数 所以它也应该适用于任何函数 当然 这对于经典语法来说是完
  • JavaScript 中的词法范围

    我对 JavaScript 中的作用域到底是如何工作的感到有点困惑 主要是词法作用域 我知道全局作用域中的变量可以在任何地方访问 在 JavaScript 中创建新作用域的唯一方法是通过创建函数 或在 ES6 中使用 let 但是 我不太明