一.首先了解几个定义:
(1)数据结构中的栈(stack)和堆(heap)
我们都知道:在计算机领域中,堆栈是两种数据结构,它们只能在一端(称为栈顶(top))对数据项进行插入和删除。
堆:队列优先,先进先出;由操作系统自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
栈:先进后出;动态分配的空间 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收,分配方式倒是类似于链表。 以上都属于计算机基础部分,在此都不详细赘述了。
:
(2)js作用域链
由于js是解释性语言,所以存在着作用域的特性(编译性语言一般不存在)。这就意味着需要一个存放作用域指针组的专用工具,这个工具就叫做作用域链,在数据结构当中是一个栈式结构。
当执行某个函数时,引擎会生成一个新的存放执行环境变量作用域,并将其指针置放到作用域链栈当中,生成活动对象(arguments)、执行上下文(this)、局部变量(local variable)。当函数执行完成,就会对作用域链栈执行pop操作,并将上一个作用域堆的对象当成执行环境作用域。
(3)存放各种变量的数据结构。
1. js基本类型:包括Undefined、Null、Boolean、Number 和String。这些类型在内存中分别占有固定大小的空间,他们的值保存在栈空间,我们通过按值来访问的。
2.引用类型:值大小不固定,栈内存中存放地址指向堆内存中的对象。是按引用访问的。如下图所示:栈内存中存放的只是该对象的访问地址,在堆内存中为这个值分配空间。由于这种值的大小不固定,因此不能把它们保存到栈内存中。但内存地址大小的固定的,因此可以将内存地址保存在栈内存中。 这样,当查询引用类型的变量时, 先从栈中读取内存地址, 然后再通过地址找到堆中的值。对于这种,我们把它叫做按引用访问。
网友评论