摘要:作用域负责收集并维护由所有声明的标识符变量组成的一系列查询,并实施一套非常严格的规则,确定当前执行的代码对这些标识符的访问权限。异常查询在所有嵌套作用域中无法遍寻到所需的变量,引擎就会抛出异常对所操作的变量进行非法或者不合理操作
1.作用域是什么? 1.1 编译原理
分词/词法分析,将字符组成的字符串分解成有意思的代码块,这些代码块称为词法单元:
var a = 2; // 代码会被分成右面这些词法单元:var、a、=、2、;
解析/语法分析,将词法单元流转换成一个由元素逐级嵌套所组成的代表了程序语法结构的树,"抽象语法树"(Abstract Syntax tree, AST)
代码生成,将AST转换为可执行代码的过程被称为代码生成。
当var a = 2;有某种方法将里面的AST转化为一组机器指令,用来创建一个叫做a的变量(包括分配内存等),并将一个值储存在a中。
对于JavaScript来说,大部分编译发生在代码执行前的几微秒。
1.2 理解作用域引擎:从头到尾负责整个JavaScript程序的编译与执行过程。
编译器:负责语法分析及代码生成等。
作用域:负责收集并维护由所有声明的标识符(变量)组成的一系列查询,并实施一套非常严格的规则,确定当前执行的代码对这些标识符的访问权限。
总结:变量赋值:首先编译器会在当前作用域中声明一个变量,然后在运行时引擎会在作用域中查找该变量,找到及赋值。
LHS查询:试图找到变量的容器本身,从而对其赋值。
RHS查询:查找某个变量的值。
function foo(a) { console.log(a); //2 } foo(2)
步骤解析:
引擎为foo进行RHS引用
作用域给引擎这个foo的值。
引擎执行foo
引擎对a进行LHS引用
作用域把foo里面的形式参数a给引擎
2赋值给a
为console进行RHS引用
为a进行RHS引用
1.3 作用域嵌套遍历嵌套作用域链:引擎从当前的执行作用域开始查找变量,找不到则到上一级去查找,当抵达最后一层全局作用域时,则强制停止。
1.4 异常ReferenceError:RHS查询在所有嵌套作用域中无法遍寻到所需的变量,引擎就会抛出ReferenceError异常
TypeErroe: 对所操作的变量进行非法或者不合理操作
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/92614.html
摘要:全局作用域局部作用域局部作用域全局作用域局部作用域块语句没有块级作用域块级声明包括和,以及和循环,和函数不同,它们不会创建新的作用域。局部作用域只在该函数调用执行期间存在。 一、什么是作用域? 作用域是你的代码在运行时,各个变量、函数和对象的可访问性。(可产生作用的区域) 二、JavaScript中的作用域 在 JavaScript 中有两种作用域 全局作用域 局部作用域 当变量定...
摘要:一言以蔽之,闭包,你就得掌握。当函数记住并访问所在的词法作用域,闭包就产生了。所以闭包才会得以实现。从技术上讲,这就是闭包。执行后,他的内部作用域并不会消失,函数依然保持有作用域的闭包。 网上总结闭包的文章已经烂大街了,不敢说笔者这篇文章多么多么xxx,只是个人理解总结。各位看官瞅瞅就好,大神还希望多多指正。此篇文章总结与《JavaScript忍者秘籍》 《你不知道的JavaScri...
摘要:最近刚刚看完了你不知道的上卷,对有了更进一步的了解。你不知道的上卷由两部分组成,第一部分是作用域和闭包,第二部分是和对象原型。附录词法这一章并没有说明机制,只是介绍了中的箭头函数引入的行为词法。第章混合对象类类理论类的机制类的继承混入。 最近刚刚看完了《你不知道的 JavaScript》上卷,对 JavaScript 有了更进一步的了解。 《你不知道的 JavaScript》上卷由两部...
摘要:关于循环和闭包当循环和闭包结合在一起时,经常会产生让初学者觉得匪夷所思的问题。闭包是一把双刃剑是比较难以理解和掌握的部分,它十分强大,却也有很大的缺陷,如何使用它完全取决于你自己。 在谈闭包之前,我们首先要了解几个概念: 什么是函数表达式? 与函数声明有何不同? JavaScript查找标识符的机制 JavaScript的作用域是词法作用域 JavaScript的垃圾回收机制 先来...
摘要:当被创建时,它的作用域链初始化为当前运行函数的属性中的对象,这些值按照他们出现在函数中的顺序,被复制到执行环境的作用域链中。然后这个对象被推入作用域链最前端。 在计算机科学中,数据存储的位置关系到代码执行过程中数据的检索速度,有一个经典的问题即为:通过改变数据的存储位置来获得最佳的读写性能。 Javascript中四种基本的数据存储位置 字面量字面量只代表自身,不存储在特定的位置。...
摘要:操作符或调用函数时传入参数的操作都会导致关联作用域的赋值操作。此外可以使用和来设置对象及其属性的不可变性级别。忽视这一点会导致许多问题。使用调用函数时会把新对象的属性关联到其他对象。 前言 《你不知道的 javascript》是一个前端学习必读的系列,让不求甚解的JavaScript开发者迎难而上,深入语言内部,弄清楚JavaScript每一个零部件的用途。本书介绍了该系列的两个主题:...
阅读 4001·2021-11-22 13:53
阅读 1628·2021-09-23 11:52
阅读 2419·2021-09-06 15:02
阅读 878·2019-08-30 15:54
阅读 844·2019-08-30 14:15
阅读 2365·2019-08-29 18:39
阅读 599·2019-08-29 16:07
阅读 399·2019-08-29 13:13