变量,作用域,内存

4 阅读2分钟

1.变量

变量可以包含原始值和引用值,原始值就是最简单的数据,引用值则是由多个值构成的对象。保存原始值的变量是按值访问的,因为我们操作的就是存储在变量中的实际值;操作对象时,实际上操作的是对该对象的引用,因此保存引用值的变量是按照引用访问的。

2.执行上下文与作用域

变量或函数的上下文决定了它们可以访问哪些数据,以及它们的行为。每个上下文都有一个关联的变量对象,而这个上下文中定义的所有变量和函数都存在于这个对象。虽然无法通过代码访问变量对象,但后台处理数据会用到它。

在浏览器中,全局上下文就是我们常说的window对象,因此所有通过var定义的全局变量和函数都会成为window对象的属性和方法。使用let和const的顶级声明不会定义在全局上下文,但在作用域链的解析上效果是一样的。上下文在其所有代码都执行完毕后会被销毁,包括定义在它上面的所有变量和函数

每个函数都有自己的上下文。当代码执行流进入函数时,函数的上下文被推到一个上下文栈中。在函数执行完之后,上下文栈会弹出该函数上下文,将控制权返还给之前的执行上下文

上下文的代码在执行的时候,会创建变量对象的一个作用域链。这个作用域链决定了各级上下文中的代码在访问变量和函数时的顺序。代码正在执行的上下文的变量对象始终位于作用域链的最前端。如果上下文是函数,则其活动对象用作变量对象。活动对象最初只有一个定义变量:arguments。作用域链中的下一个变量对象来自包含上下文,再下一个变量对象来自再下一个包含上下文,以此类推至全局上下文。