博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JavaScript作用域
阅读量:6594 次
发布时间:2019-06-24

本文共 1192 字,大约阅读时间需要 3 分钟。

几乎所有编程语言最基本的功能之一,就是能够存储变量当中的值,并能在之后对这个值进行访问或修改。事实上,正是这种存储和访问变量的值的能力将状态带给了程序。

但是将变量引入程序会引起几个很有意思的问题,也正是我们将要讨论的:

这些变量住在哪里?换句话说,它们存储在哪里?最重要的是,程序需要时如何找到它们?

这些问题说明需要一套设计良好的规则来存储变量,并且之后可以方便地找到这些变量。这套规则被称为作用域。

编译原理

尽管通常将JavaScript归类为“动态”或“解释执行”语言,但事实上它是一门编译语言。

但与传统的编译语言不同,它不是提前编译的,编译结果也不能在分布式系统中进行移植。

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

首先,JavaScript引擎不会有大量的时间来进行优化,因为与其他语言不通,JavaScript的编译过程不是发生在构建之前的。

对于JavaScript来说,大部分情况下编译发生在代码执行前的几微妙的时间内。在我们所要讨论的作用域的背后,JavaScript引擎用尽了各种方法(比如JIT,可以延迟编译甚至实施重新编译)来保证性能最佳。

简单地说,任何JavaScript代码片段在执行前都要进行编译(通常就在执行前)。

理解作用域

演员表

首先介绍将要参与到对程序 var a = 2;进行处理的过程中的演员们,这样才能理解接下来

将要听到的对话。

  • 引擎

从头到尾负责整个JavaScript程序的编译及执行过程。

  • 编译器

引擎的好朋友之一,负责语法分析及代码生成等脏活累活

  • 作用域

引擎的另一位好朋友,负责收集并维护由所有声明的标识符组成的一系列查询,并实施一套非常严格的规则,确定当前执行的代码对这些标识符的访问权限。

对话

当你看见var a=2;这段程序时,很可能认为这是一句声明。但我们的新朋友引擎却不这么看。

事实上,引擎认为这里有两个完全不同的声明,一个由编译器在编译时处理,另一个则由引擎在运行时处理。

变量的赋值操作会执行两个动作,首先编译器会在当前作用域中声明一个变量,然后在运行时引擎会在作用域中查找该变量,如果能够找到就会对它赋值。

编译器有话说

编译器在编译过程的第二步代码中生成了代码,引擎执行它时,会通过查找变量a来判断它是否已声明过。查找的过程由作用域进行协助,但是引擎执行怎样的查找,会影响最终的查找结果。

在上面的例子中,引擎会为变量a进行LHS查询。另外一个查找的类型叫作RHS.换句话说,当变量出现在赋值操作的左侧时进行LHS查询,出现在右侧时进行RHS查询。

讲的更准确一点,RHS查询与简单地查找某个变量的值别无二致,而LHS查询则是试图找到变量的容器本身,从而可以对其赋值。

转载地址:http://xqcio.baihongyu.com/

你可能感兴趣的文章
【Android视图效果】分组列表实现吸顶效果
查看>>
使用流的方式往页面前台输出图片
查看>>
Shader 学习笔记 ---Depth of Field 介绍
查看>>
星级 评分
查看>>
通信协议之广播---recvfrom 放回客户端的ip地址第一次全为0.0.0.0
查看>>
item2
查看>>
分享11个超棒的移动应用(mobile apps)开发解决方案
查看>>
C/C++获取文件大小
查看>>
深入理解Java内存模型(五)——锁
查看>>
Chalubo僵尸网络来袭 IOT设备或将受到DDoS攻击
查看>>
如何实现百万TPS?详解JMQ4的存储设计
查看>>
这么说吧,NIO很简单,其实就是个牛逼IO
查看>>
使用Python快速获取公众号文章定制电子书(二)
查看>>
iOS下JS与OC互相调用(七)--Cordova 基础
查看>>
Nacos v0.7.0:对接CMDB,实现基于标签的服务发现能力
查看>>
【开发问题记录①】关于滑动CollectionView时ContentSize变化的问题
查看>>
java中GC的基本概念
查看>>
building xxx gradle project info的解决办法
查看>>
在 CentOS 7 上搭建 Jenkins + Maven + Git 持续集成环境
查看>>
数据结构与算法 | Leetcode 19. Remove Nth Node From End of List
查看>>