第一章 作用域是什么
- 编译
- 作用域
- 作用域嵌套
javascript通常被归类为“动态”或者解释性语言,但事实上他是一门编译语言,与传统的编译语言不同的是,它不是提前编译的,编译结果也不能在分布式系统中进行移植。尽管如此javascript引擎进行编译和传统的编译语言非常相似,在某些环节可能是比预想的要复杂的,在传统编译语言的流程中,程序中的一段源代码在执行之前会经历三个步骤,统称为 "编译"
分词
- 解析/语法分析
这个过程大概就是将词法单元流转化成一个有元素逐级嵌套所组成的代表了程序语法的结构树 称为抽象语法书 - 代码生成
大概就在这个阶段进行变量的内存分配 - 个人小结:
编译型语言:把做好的源程序全部编译成二进制代码的可运行程序。然后,可直接运行这个程序。 解释型语言:把做好的源程序翻译一句,然后执行一句,直至结束!
在看这本书之前一直称javascript是一门解释性语言,通常大家都叫它是脚本语言。刚好最近在学习java 可以让你更加对编译这个阶段比较清楚一点 直接上图啦
这个.java文件里面的东西很简单就是输出一个"Hello world"
下面我们将它编译成java虚拟机可以执行的class文件
我们用java编译器将java 编译成class 文件 将这个文件再交给java虚拟机让虚拟机执行里面的代码,这个过程是不是更加清楚编译这个过程 大概就是在代码执行前,编译器对我们写的代码进行了检查和搭建运行代码的环境吧。在javaacript里面重要的一个概念就是作用域,作用域链。下面我们进入作用域你的学习。
第二章 词法作用域
我们将“作用域”定义为一套规则,这套规则用来管理引擎如何在当前作用域以及嵌套的作用域里面根据标识符名称进行变量查找。
词法阶段
- 书上的例子
function
我在这里把书中的例子再啰嗦一遍hhh
2.2中主要讲了开发者如何欺骗词法
欺骗词法主要有两种途径,在这里提及一下,不做大篇幅的说明,作者也有说尽量避免使用
- eval()
- with
大家知道一下就可以啦,在这里把作者不推荐使用的原因大概罗列一下把。
- eval()和with会被严格模式所影响(限制)。
- 这两个机制的副作用是引擎无法在编译时对作用域查找进行优化,因为引擎只能谨慎的认为这样的优化是无效的。使用者其中任何一个机制都将导致代码运行变慢。不要使用它们。
好啦第二者完结^_^,棒棒的。开启第三章的总结
第三章 , 函数作用域和块作用域
3.1函数中的作用域
明确概念
函数作用域的含义是指,属于这个函数的全部变量都可以在整个函数的范围内使用及复用(事实上在嵌套的作用域中也可以使用)。这种方案是非常有用的,能充分利用javascript变量可以根据需要改变值类型的 "动态"特征
3.2 隐藏在内部的实现
这里着重说一下规避冲突
function
变量冲突常见的就是存在于全局作用域中,当程序中加载了多个第三方库时,如果它们没有妥善的将内部私有的函数或者变量隐藏起来,就会很容易引发冲突,还有就是多人合作开发的时候,尽量将全局变量都做好注释,或者少用全局变量。
类库的通常做法是暴露出去一个对象
eg:
var
3.3函数作用域
我们知道在任何代码外面加都可以添加包装函数,可以将内部的变量和函数定义“隐藏”起来,外部作用域无法访问到包装函数内部的任何内容。
eg
var
3.3.1 匿名和具名
- 匿名函数
- 匿名函数在栈内存追踪中不会显示出有意义的函数名,使得调试很困难。
- 对于代码的可读性,有着很重要的作用,一个描述性的名称可以让代码不言而明。
3.3.2 立即执行函数
var
3.4 块级作用域
- try/catch
非常少有人注意到Javascript的ES3规范中规定try/catch分句会创建一个块作用域,其中声明的变量仅在catch作用域内部有效
eg
try
- let
- let关键字可以将变量绑定到所在的任意作用域中,通常是{....}内部。换句话说,let可以显示的将作用域用{}清楚的分来,以便于程序的开发,以及维护。
- let 声明的变量不会再作用域内产生变量提升,声明的代码在运行之前并不“存在”而非var 声明的变量会输出undefined
eg
//var
好啦,今天先写到这里,待后续。。。