加入收藏 | 设为首页 | 会员中心 | 我要投稿 信阳站长网 (https://www.0376zz.com.cn/)- 基础存储、混合云网络、云安全、数据仓库、大数据!
当前位置: 首页 > 站长资讯 > 动态 > 正文

JavaScript的作用域

发布时间:2021-03-30 16:07:07 所属栏目:动态 来源:互联网
导读:编程语言的最基本功能之一就是能够存储变量当中的值,以便于之后的使用于修改。也正是这个功能将状态带给了程序。 在JavaScript中,作用域就是一套设计良好的规则来存储变量。 简述编译原理 通常我们会将JavaScript归类为动态或解释执行语言,但它实际上是一

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

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

简述编译原理

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

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

  •  分词/词法分析

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

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

  •  解析/语法分析

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

 

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

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

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

  •  引擎:从头到尾负责整个JavaScript程序编译及执行过程
  •  编译器:负责语法分析及代码生成
  •  作用域:负责收集维护由所有变量组成的一系列查询

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

  1.  编译器首先将这段代码分解成词法单元,然后解析为树结构。(在下一步代码生成时,处理这段代码的方式会跟预期有所不同)
  2.  遇到 var foo ,编译器会检查作用域是否已有同名变量存在。如果有的话编译器会忽略声明,继续编译。否则它会生成代码在当前作用域的变量集合中声明一个新的变量,命名为 foo
  3.  接下来编译器会为引擎生成运行时所需代码,用来处理 foo = 'bar' 这个赋值操作。
  4.  引擎运行时会首先查询当前作用域是否存在叫做 foo 的变量。如果有引擎则会使用这个变量,否则会一直向上层作用域查找。
  5.  如果最终找到了 foo 这个变量,就会将 'bar' 赋给它,否则抛出异常。

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

LHS查询 vs RHS查询

(编辑:信阳站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读