论闭包前先了解以下执行上下文
执行上下文
什么是执行上下文:执行上下文是评估和执行JavaScript代码的环境的抽象概念,每当JavaScript代码运行时,它都是在执行上下文中运行的。
执行上下文的类型
全局执行上下文
这是基础的或者默认的执行上下文,任何不再函数内部的代码都在全局执行上下文中。在浏览器中,全局执行上下文会创建一个全局的window对象,并让this指向window对象,一个程序只能有一个全局执行上下文。
函数执行上下文
每当一个函数被调用时,都会为该函数创建一个新的执行上下文,每个函数都有它的执行上下文件了。多个函数对应多个函数执行上下文,所以函数执行上下文可以有任意多个,这是函数执行上下文与全局执行上下文的区别之一。
Eval函数执行上下文
eval()
函数用于将传入的字符串当做 JavaScript 代码进行执行。如果传入的参数不是字符串,那么eval()将传入值原封不动得返回。
console.log(eval('2 + 2')); // expected output: 4 eval(new String("2 + 2")); // 返回了包含"2 + 2"的字符串对象 console.log(eval('2 + 2') === eval('4')); // expected output: true
执行在eval函数内部的代码会拥有属于它自己的执行上下文。
执行上下文的生命周期
一个执行上下文的生命周期分为创建和执行阶段
创建阶段
创建阶段发生的三件事是:
1.创建变量对象
创建变量对象主要包括三个步骤:
1.检查当前上下文中的参数。该过程生成Arguments对象。并建立以形参变量名为属性名,形参变量值为属性值的属性。
2.检索当前上下文中的函数声明。该过程建立以函数名为属性名,函数所在的内存地址引用为属性值的属性。
3.检索当前上下文中的变量声明。该过程建立变量名为属性名,undefine为属性值的属性。
2.建立作用域链
作用域链是由当前上下文和上层上下文的一系列变量对象所组成的层级链。在执行上下文执行阶段。当需要查找某个变量或者函数时,会在当前执行上下文中的变量对象中查找,如果没有找到则会沿着上层上下文的变量对象层层往上查找,直到查找到全局上下文中的变量对象。
3.确定this指向
当函数被调时,会创建该函数的执行上下文,同时确定this的指向,所以说this是在函数被调用时确定的。
关于this指向。
执行阶段
执行阶段的工作只要是为变量赋值以及执行其他代码,在执行阶段,变量对象会转换为活动对象,原先声明的变量会被赋值。