
1.1执行上下文、作用域链、闭包
第一步:介绍JavaScript的执行上下文
什么是执行上下文,是评估和执行JS代码的环境的抽象的概念。每当JS代码在执行的时候,都是在执行上下文中执行。
JS的三种执行上下文类型:
- 全局执行上下文--此类型算是一种默认的基础情况,任何不在函数内部代码都在全局上下文中。她会执行两件事:创建一个全局的Window对象(浏览器环境中),并且设置this的指向是 这个全局对象。一个程序中只会有一个全局执行上下文
- 函数执行上下文--顾名思义,在一个函数被调用时,都会为该函数创建一个新的上下文。每个函数都有他自己的执行上下文,不过是在函数调用时创建的。函数的上下文可以有多个。每当一个新的执行上下文被创建,她会按定义的顺序执行一些列步骤
- Eval 函数执行上下文--属于函数执行上下文的一种特殊情况,是执行在Eval函数内部的代码所属的自己的执行上下文,但是由于此种情况应用场景极少,不做讨论
更多详细介绍可阅读[译] 理解 JavaScript 中的执行上下文和执行栈
第二步:介绍JavaScript的作用域链
什么是作用域?知道了作用域,我们才能更好的理解作用域链。
传统语言编译都需要经历三个过程:分词/词法分析(Tokenizing/Lexing)、解析/语法分析(Parsing)、代码生成
而编译呢需要以下三位角色:
- 引擎-- 从头到尾负责整个JS 程序的编译和执行
- 编译器--引擎的好朋友之一,负责语法分析和代码生成等
- 作用域--引擎的另外一个好朋友,负责收集并维护由所有声明的标识符(变量)组成的一系列查询,并实施了一套严格的规则,确定当前的代码对这些标识符的访问权限

第三步:介绍JavaScript的闭包及应用场景
简单讲,闭包就是指有权访问另一个函数作用域中的变量的函数。
MDN 上面这么说:闭包是一种特殊的对象。它由两部分构成:函数,以及创建该函数的环境。环境由闭包创建时在作用域中的任何局部变量组成。
最基础的闭包创建方式就是--在一个函数内部创建另一个函数
闭包的缺陷:
闭包的缺点就是常驻内存会增大内存使用量,并且使用不当很容易造成内存泄露。
如果不是因为某些特殊任务而需要闭包,在没有必要的情况下,在其它函数中创建函数是不明智的,因为闭包对脚本性能具有负面影响,包括处理速度和内存消耗。
闭包的应用场景:设置私有变量或方法
闭包的手写代码太多了,就不做展示了,苦逼加班狗要去忙了,今天就聊到这里,( ^_^ )/~~拜拜
参考资料:
《JavaScript 高级程序设计(第三版)》