iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > VUE >JavaScript的作用域有什么用
  • 385
分享到

JavaScript的作用域有什么用

2024-04-02 19:04:59 385人浏览 薄情痞子
摘要

本篇文章为大家展示了javascript的作用域有什么用,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。 作用域的概念现代编程语言的最基本功能之一就是能够存

本篇文章为大家展示了javascript的作用域有什么用,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

 作用域的概念

现代编程语言的最基本功能之一就是能够存储变量当中的值,以便于之后的使用于修改。也正是这个功能将状态带给了程序。

在JavaScript中,作用域就是一套设计良好的规则来存储变量。

简述编译原理

通常我们会将JavaScript归类为“动态”或“解释执行“语言,但它实际上是一门编译语言。与传统的编译语言不同,它不是提前编译的,编译结果也不能在分布式系统中进行移植。

例如V8引擎,为了提高JavaScript代码的运行性能,在运行之前会先将其编译为本地的机器码,然后再去执行机器码,达到提升速度的目的。

  •  分词/词法分析

         这个过程将由字符组成的代码分解成对程序有意义的代码块,这些代码块被称为词法单元。

  例如 var foo = 'bar' 通常会被分解为这些词法单元:var 、 foo 、 = 、 'bar'

  •  解析/语法分析

         这个过程将词法单元转换成一个“由元素逐级嵌套组成的代表程序语法的树“,这个树被称为“抽象语法树”(AST)。   

JavaScript的作用域有什么用

    image

  •  代码生成

        将上边的抽象语法树转换为机器可执行代码

JavaScript引擎比只有三个步骤的语言的编译器要复杂的多。例如在语法分析和代码生成阶段有特定的步骤来对运行性能进行优化,包括对冗余元素进行优化等。

对于JavaScript来说,大部分情况下编译发生在代码执行的前几微秒,任何代码片段在执行前都要进行编译。因此JavaScript编译器首先对 var foo = 'bar' 进行编译,然后做好执行它的准备,并且通常马上就会执行它。

引擎、编译器、作用域在赋值操作中的配合

  •  引擎:从头到尾负责整个JavaScript程序编译及执行过程

  •  编译器:负责语法分析及代码生成

  •  作用域:负责收集维护由所有变量组成的一系列查询

对于 var foo = 'bar' 这段代码,大家很有可能认为是一句简单的声明。而事实上JavaScript执行时会将它分成两个完全不同的声明。

  1. 鸿蒙官方战略合作共建——HarmonyOS技术社区

  2.  编译器首先将这段代码分解成词法单元,然后解析为树结构。(在下一步代码生成时,处理这段代码的方式会跟预期有所不同)

  3.  遇到 var foo ,编译器会检查作用域是否已有同名变量存在。如果有的话编译器会忽略声明,继续编译。否则它会生成代码在当前作用域的变量集合中声明一个新的变量,命名为 foo

  4.  接下来编译器会为引擎生成运行时所需代码,用来处理 foo = 'bar' 这个赋值操作。

  5.  引擎运行时会首先查询当前作用域是否存在叫做 foo 的变量。如果有引擎则会使用这个变量,否则会一直向上层作用域查找。

  6.  如果最终找到了 foo 这个变量,就会将 'bar' 赋给它,否则抛出异常。

总结:变量的赋值会执行两个动作:首先是编译器在当前作用域中声明变量(如果变量未被声明过);接着运行时引擎在作用域查找该变量,能找到就会对它赋值。

LHS查询 vs RHS查询

引擎执行编译器生成的代码时,会通过查找 foo 来判断是否已经声明过。查找的过程由作用域来协助。在我们的例子中,引擎为变量 foo 进行的时LHS查询,还有另一个查找类型叫RHS查询。顾名思义,它们的意思是Left hand side 和 Right hand side

  •  LHS:变量出现在赋值操作的左侧(查找赋值操作的目标是谁)

  •  RHS:变量在其他位置出现(查找值的源头) 

// 考虑下边的代码  console.log(foo)

此例中 foo 的引用就是RHS查询,这里没有赋予 foo 任何值,相反的,我们需要查找 foo 的值,才能传递给log方法。

// 相比之下  foo = 'bar'

这里对 foo 的查询则是LHS查询,我们并不关心 foo 当前的值是什么, 只是想为这个赋值操作找到目标。

// 再分析下边的代码  function foo(a) {    console.log(a)  }  foo('bar')

这段代码里既有LHS查询又有RHS查询

  1. 鸿蒙官方战略合作共建——HarmonyOS技术社区

  2.  最后一行 foo(...) 函数的调用需要对 foo 进行RHS查询 → 找到 foo 的值

  3.  入参时存在隐式的 a = 'bar' ,需要对 a 进行LHS查询

  4.  console.log(a) 对 a 进行RHS查询

  5.  console.log(...) 本身也需要对 console 对象进行RHS查询

作用域的嵌套

我们在文章开始时说过,作用域是根据名称查找变量的一套规则。实际情况中需要同时顾及几个作用域。

当一个块或函数嵌套在另一个块或函数中时,就发生了作用域的嵌套。因此在当前作用域中没有查找到目标变量时,会逐层向上查找直到全局作用域。

// 考虑以下代码  function foo(a) {  console.log(a + b)  }  var b = 258;  foo(369)

对 b 进行的RHS查询无法在 foo 内部完成,但可以在上一级的作用域中完成(在此例中是全局作用域)。

LHS,RHS查询都会在作用域内逐层查找,直到找到为止(或到达全局作用域)。

ReferenceError

上一节提到了LHS,RHS都会在作用域内逐层查找变量,但如果到达全局作用域仍然没有找到变量怎么办呢?

这时区分LHS和RHS查询的意义就体现出来了。

如果RHS查询在所有嵌套的作用域中都没有找到所需变量,引擎就会抛出 ReferenceError。

如果LHS查询在所有嵌套的作用域中都没有找到所需变量,引擎就会在全局作用域中创建一个具有该名称的变量,并将其返回给引擎。

注意:ES5中引入了严格模式,与普通模式相比,严格模式其中一个不同就是进制自动或隐式的创建全局变量。因此在严格模式下LHS查询失败时不会创建并返回全局变量,引擎同样会抛出 ReferenceError。

总结

  •  作用域是一套规则,用于确定在何处以及如何查找变量。如果查找的目的是对变量赋值,会使用LHS查询;如果目的是获取变量的值,会使用RHS查询。

  •  JavaScript引擎会在代码执行前对其进行编译。在这个过程中,像 var foo = 'bar' 这种声明会被分解成两个独立的步骤。

          1.  var foo 在其作用域中声明新的变量。此操作在代码执行前进行。

          2.  接下来 foo = 'bar' 会查询(LHS)变量 foo 并对其赋值。

  •  LHS和RHS查询都会在当前执行作用域中开始,如果有需要(没有在当前作用域找到变量)就会向上级作用域继续查找目标变量,一直抵达全局作用域,无论找到与否都会停止。

  •  不成功的RHS查找会导致抛出 ReferenceError ,不成功的LHS查找会导致自动隐式地创建一个全局变量(非严格模式下),或者抛出 ReferenceError(严格模式下)。 

上述内容就是JavaScript的作用域有什么用,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注编程网VUE频道。

--结束END--

本文标题: JavaScript的作用域有什么用

本文链接: https://www.lsjlt.com/news/67734.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • JavaScript的作用域有什么用
    本篇文章为大家展示了JavaScript的作用域有什么用,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。 作用域的概念现代编程语言的最基本功能之一就是能够存...
    99+
    2022-10-19
  • JavaScript的作用域链有什么用
    JavaScript的作用域链有什么用,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。JavaScript的作用域链这是一个非常...
    99+
    2022-10-19
  • javascript的块级作用域有什么作用
    今天小编给大家分享一下javascript的块级作用域有什么作用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我...
    99+
    2022-10-19
  • Javascript的作用域和作用域链是什么
    这篇文章主要介绍Javascript的作用域和作用域链是什么,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Javascript 的作用域和作用域链作用域: 作用域是定义变量...
    99+
    2022-10-19
  • 什么是JavaScript作用域
    本篇内容介绍了“什么是JavaScript作用域”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在JavaS...
    99+
    2022-10-19
  • JavaScript作用域链是什么
    本篇内容介绍了“JavaScript作用域链是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!作用域1....
    99+
    2022-10-19
  • javascript中什么是作用域
    这篇文章给大家介绍javascript中什么是作用域,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。JavaScript可以做什么1.可以使网页具有交互性,例如响应用户点击,给用户提供更好的体验。2.可以处理表单,检验用...
    99+
    2023-06-14
  • jsp的作用域有什么
    这篇文章将为大家详细讲解有关jsp的作用域有什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。 application:在所有应用程序中有效,即只要这个网站运行着,这个...
    99+
    2022-10-19
  • javascript中作用域指的是什么
    javascript中作用域指的是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。在javascript中,作用域是变量(对象、函数)的...
    99+
    2022-10-19
  • SpringBean作用域有什么用
    本篇内容介绍了“SpringBean作用域有什么用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!singleton:单例模式,在整个Spri...
    99+
    2023-06-04
  • JavaScript作用域有哪些
    小编给大家分享一下JavaScript作用域有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、作用域通常来说,一段程序代码中所用到的名字并不总是有效和可用的...
    99+
    2023-06-21
  • 域名有什么作用
    域名的作用:1、能够给企业网站带来更多的访客流量;2、一个优质的域名能够促进企业品牌的推广;3、优质的域名更加容易让用户记忆深刻,从而帮助企业网站吸引回头率、激发潜在用户;4、能够帮助企业用户创造品牌价值。具体内天如下:获取更多的流量某些域...
    99+
    2022-10-13
  • javascript有块级作用域吗
    这篇文章主要介绍javascript有块级作用域吗,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完! 在JavaScript中,没有块级作用域的概念。在块级语...
    99+
    2022-10-19
  • JavaScript中作用域工作模型是什么
    这篇文章主要介绍了JavaScript中作用域工作模型是什么 ,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。JavaScript内功系列:this指向详解,思维脑图与代码的结...
    99+
    2023-06-14
  • JavaScript有什么作用
    JavaScript的作用有:1、为网页添加各式各样的动态功能,例如在HTML页面中嵌入动态文本;2、对浏览器事件做出响应;3、能够读写HTML元素的内容;4、在数据被提交到服务器之前,用JavaScript来验证数据;5、可用JavaSc...
    99+
    2022-10-18
  • vue作用域插槽有什么用
    这篇文章给大家分享的是有关vue作用域插槽有什么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。作用域插槽利用好作用域插槽可以做一些很有意思的事情,比如定义一个基础布局组件A,只...
    99+
    2022-10-19
  • PHP中include作用域有什么用
    本篇文章为大家展示了PHP中include作用域有什么用,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。注意:本文档基于include叙述,但也适用于 require。这两种结构除了在如何处理包含失败...
    99+
    2023-06-17
  • JavaScript中的作用域
    本篇文章为大家展示了JavaScript中的作用域,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。什么是作用域作用域是根据名称查找变量的一套规则。理解作用域先来理解一些基础概念:引擎:从头到尾负责整个...
    99+
    2023-06-15
  • JavaScript作用域链是什么及怎么使用
    这篇文章主要介绍了JavaScript作用域链是什么及怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇JavaScript作用域链是什么及怎么使用文章都会有所收获,下面我们一起来看看吧。1. 作用域是什么...
    99+
    2023-07-04
  • javascript的isNaN有什么作用
    这篇文章主要介绍了javascript的isNaN有什么作用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇javascript的isNaN有什么作用文章都会有所收获,下面我们一...
    99+
    2022-10-19
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作