javascript 变量、作用域、与内存

javascript变量可以保存两种类型的值:原始值(简单数据类型)和引用值(复杂数据类型)。原始值和引用值有以下特点。

* 原始值大小固定,因此保留在栈内存上。

* 从一个变量到另一个变量复制原始值会创建该值的第二个副本。

* 引用值是对象,存储在堆内存上。

* 包含引用值的变量实际上只包含指向相应对象的一个指针,而不是对象本身。

* 从一个变量复制另一个变量复制引用值只会复制指针,而 instanceof 操作符确保值的引用类型。

任何变量(不管是包含的是原始值还是引用值)都存在于某个执行上下文中(也称为作用域)。这个上下文(作用域)决定了变量的生命周期,以及他们可以访问代码的那些部分。

* 执行上下文分全局上下文、函数上下文和块级上下文

* 代码执行流每进入一个新上下文,都会创建一个作用域链,用于搜索变量和函数

* 函数或块的局部上下文不仅可以访问自己作用域内的变量,而且也可以访问任何包含上下文乃至全局上下文中的变量

* 全局作用域只能访问全局上下文中的变量和函数,不能访问局部上下文中的任何数据。

* 变量执行上下文用于确定什么时候释放内存。

javascript 是使用垃圾回收的编程语言,开发者不需要操心内存分配和回收。

* 离开作用域的值会被自动标记为可回收,然后在垃圾回收期间被删除。

* 主流的垃圾回收算法是标记清理,即先给当前不使用的值加上标记,再回来回收他们的内存。

* 引用技术是另一种垃圾回收策略。需要记录值被引用了多少次。javascript 引擎不再使用这种算法。但某些旧版本的IE仍然会受到这种算法的影响。原因是javascript会访问原生的javascript对象(DOM对象)。

* 引用计数在代码中存在循环引用时会出现问题。

* 解除变量的引用不仅可以消除循环引用,而且对垃圾回收也有帮助。为促进内存回收,全局对象、全局对象的属性和循环引用都应该在不需要时解除引用。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容