资讯专栏INFORMATION COLUMN

JavaScript作用域

Anleb / 874人阅读

摘要:理解作用域演员表首先介绍将要参与到对程序进行处理的过程中的演员们,这样才能理解接下来将要听到的对话。查找的过程由作用域进行协助,但是引擎执行怎样的查找,会影响最终的查找结果。

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

但是将变量引入程序会引起几个很有意思的问题,也正是我们将要讨论的:
这些变量住在哪里?换句话说,它们存储在哪里?最重要的是,程序需要时如何找到它们?

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

编译原理

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

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

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

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

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

理解作用域 演员表

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

引擎

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

编译器

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

作用域

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

对话

当你看见var a=2;这段程序时,很可能认为这是一句声明。但我们的新朋友引擎却不这么看。
事实上,引擎认为这里有两个完全不同的声明,一个由编译器在编译时处理,另一个则由引擎在运行时处理。

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

编译器有话说

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

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

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/107187.html

相关文章

  • JavaScript深入之词法作用和动态作用

    摘要:作用域作用域是指程序源代码中定义变量的区域。采用词法作用域,也就是静态作用域。而与词法作用域相对的是动态作用域,函数的作用域是在函数调用的时候才决定的。前面我们已经说了,采用的是静态作用域,所以这个例子的结果是。 JavaScript深入系列的第二篇,JavaScript采用词法作用域,什么语言采用了动态作用域?两者的区别又是什么?还有一个略难的思考题,快来看看吧。 作用域 作用域是指...

    gclove 评论0 收藏0
  • 理解JavaScript的核心知识点:作用

    摘要:也毫不例外,但在中作用域的特性与其他高级语言稍有不同,这是很多学习者久久难以理清的一个核心知识点。主要使用的是函数作用域。 关于作用域:About Scope 作用域是程序设计里的基础特性,是作用域使得程序运行时可以使用变量存储值、记录和改变程序的状态。JavaScript 也毫不例外,但在 JavaScript 中作用域的特性与其他高级语言稍有不同,这是很多学习者久久难以理清的一个核...

    HelKyle 评论0 收藏0
  • 谈谈javascript语法里一些难点问题(二)

    摘要:讲作用域链首先要从作用域讲起,下面是百度百科里对作用域的定义作用域在许多程序设计语言中非常重要。原文出处谈谈语法里一些难点问题二 3) 作用域链相关的问题 作用域链是javascript语言里非常红的概念,很多学习和使用javascript语言的程序员都知道作用域链是理解javascript里很重要的一些概念的关键,这些概念包括this指针,闭包等等,它非常红的另一个重要原因就...

    Enlightenment 评论0 收藏0
  • 大话javascript 1期:作用作用

    摘要:全局作用域局部作用域局部作用域全局作用域局部作用域块语句没有块级作用域块级声明包括和,以及和循环,和函数不同,它们不会创建新的作用域。局部作用域只在该函数调用执行期间存在。 一、什么是作用域? 作用域是你的代码在运行时,各个变量、函数和对象的可访问性。(可产生作用的区域) 二、JavaScript中的作用域 在 JavaScript 中有两种作用域 全局作用域 局部作用域 当变量定...

    NicolasHe 评论0 收藏0
  • 深入学习js之——词法作用和动态作用

    摘要:在中的应用采用词法作用域,也就是静态作用域。那什么又是词法作用域或者静态作用域呢请继续往下看静态作用域与动态作用域因为采用的是词法作用域函数的作用域在函数定义的时候就决定了。 开篇 当我们在开始学习任何一门语言的时候,都会接触到变量的概念,变量的出现其实是为了解决一个问题,为的是存储某些值,进而,存储某些值的目的是为了在之后对这个值进行访问或者修改,正是这种存储和访问变量的能力将状态给...

    shiweifu 评论0 收藏0
  • JavaScript作用和闭包

    摘要:依然持有对该作用域的引用,而这个引用就叫作闭包。循环和闭包正常情况下,我们对这段代码行为的预期是分别输出数字,每秒一次,每次一个。 一、作用域 作用域共有两种主要的工作模型:第一种是最为普遍的,被大多数编程语言所采用的词法作用域,另外一种叫作动态作用域; JavaScript所采用的作用域模式是词法作用域。 1.词法作用域 词法作用域意味着作用域是由书写代码时函数声明的位置来决定...

    animabear 评论0 收藏0

发表评论

0条评论

Anleb

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<