javascript 的变量、作用域和内存问题


Posted in Javascript onApril 19, 2017

javascript 的变量、作用域和内存问题

(一)JavaScript变量可以用来保存两种类型的值:基本类型值和引用类型值。基本类型的值源自以下5种基本数据类型:Undefined、Null、Boolean、Number和 String。基本类型值和引用类型值具有以下特点:

1.基本类型值在内存中占据固定大小的空间,因此被保存在栈内存中;

2.从一个变量向另一个变量复制基本类型的值,会创建这个值的一个副本;

3.引用类型的值是对象,保存在堆内存中;   

4.包含引用类型值的变量实际上包含的并不是对象本身,而是一个指向该对象的指针;

5.从一个变量向另一个变量复制引用类型的值,复制的其实是指针,因此两个变量最终都指向同一个对象;

6.确定一个值是哪种基本类型可以使用typeof操作符,而确定一个值是哪种引用类型可以使用instanceof操作符。

(二)所有变量(包括基本类型和引用类型)都存在于一个执行环境(也称为作用域)当中,这个执行环境决定了变量的生命周期,以及哪一部分代码可以访问其中的变量。以下是关于执行环境的几点总结:

1.执行环境有全局执行环境(也称为全局环境)和函数执行环境之分;

2.每次进入一个新执行环境,都会创建一个用于搜索变量和函数的作用域链;

3.函数的局部环境不仅有权访问函数作用域中的变量,而且有权访问其包含(父)环境,乃至全局环境;

4.全局环境只能访问在全局环境中定义的变量和函数,而不能直接访问局部环境中的任何数据;变量的执行环境有助于确定应该何时释放内存。

(三)JavaScript是一门具有自动垃圾收集机制的编程语言,开发人员不必关心内存分配和回收问题。可以对JavaScript的垃圾收集例程作如下总结。

1.离开作用域的值将被自动标记为可以回收,因此将在垃圾收集期间被删除。

2.“标记清除”是目前主流的垃圾收集算法,这种算法的思想是给当前不使用的值加上标记,然后再回收其内存。

3.另一种垃圾收集算法是“引用计数”,这种算法的思想是跟踪记录所有值被引用的次数。JavaScript引擎目前都不再使用这种算法;

4.但在IE中访问非原生JavaScript对象(如DOM元素)时,这种算法仍然可能会导致问题。当代码中存在循环引用现象时,“引用计数”算法就会导致问题。

6.为了确保有效地回收内存,应该及时解除不再使用的全局对象、全局对象属性以及循环引用变量的引用。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

Javascript 相关文章推荐
比较简单实用的使用正则三种版本的js去空格处理方法
Nov 18 Javascript
Array.prototype.concat不是通用方法反驳[译]
Sep 20 Javascript
HTML长文本截取含有HTML代码同样适用的两种方法
Jul 31 Javascript
js中匿名函数的创建与调用方法分析
Dec 19 Javascript
jQuery实现Email邮箱地址自动补全功能代码
Nov 03 Javascript
使用JavaScript和CSS实现文本隔行换色的方法
Nov 04 Javascript
理解javascript中的MVC模式
Jan 28 Javascript
使用getBoundingClientRect方法实现简洁的sticky组件的方法
Mar 22 Javascript
Ajax基础知识详解
Feb 17 Javascript
jquery单击文字或图片内容放大并居中显示
Jun 23 jQuery
完美解决axios跨域请求出错的问题
Feb 05 Javascript
HTML+JavaScript实现扫雷小游戏
Sep 30 Javascript
javascript中json对象json数组json字符串互转及取值方法
Apr 19 #Javascript
javascript 中null和undefined区分和比较
Apr 19 #Javascript
jQuery Plupload上传插件的使用
Apr 19 #jQuery
Vuex之理解Mutations的用法实例
Apr 19 #Javascript
Vuex之理解Getters的用法实例
Apr 19 #Javascript
Vuex之理解state的用法实例
Apr 19 #Javascript
微信小程序 聊天室简单实现
Apr 19 #Javascript
You might like
Mac系统下使用brew搭建PHP(LNMP/LAMP)开发环境
2015/03/03 PHP
PHP调用.NET的WebService 简单实例
2015/03/27 PHP
在php的yii2框架中整合hbase库的方法
2018/09/20 PHP
ExtJS 简介 让你知道extjs是什么
2008/12/29 Javascript
使图片旋转的3种解决方案
2013/11/21 Javascript
javascript在网页中实现读取剪贴板粘贴截图功能
2014/06/07 Javascript
jQuery控制的不同方向的滑动(向左、向右滑动等)
2014/07/18 Javascript
jQuery+css实现百度百科的页面导航效果
2014/12/16 Javascript
理解javascript中Map代替循环
2016/02/26 Javascript
js实现图片缓慢放大缩小效果
2016/08/02 Javascript
利用JQuery阻止事件冒泡
2016/12/01 Javascript
原生js实现水平方向无缝滚动
2017/01/10 Javascript
jQuery Form表单取值的方法
2017/01/11 Javascript
移动端网页开发调试神器Eruda的介绍与使用技巧
2017/10/30 Javascript
JavaScript框架Angular和React深度对比
2017/11/20 Javascript
boostrap模态框二次弹出清空原有内容的方法
2018/08/10 Javascript
[51:00]Secret vs VGJ.S 2018国际邀请赛淘汰赛BO3 第一场 8.24
2018/08/25 DOTA
pycharm 使用心得(七)一些实用功能介绍
2014/06/06 Python
python 接口返回的json字符串实例
2018/03/27 Python
django初始化数据库的实例
2018/05/27 Python
Python datetime和unix时间戳之间相互转换的讲解
2019/04/01 Python
python中树与树的表示知识点总结
2019/09/14 Python
使用Fabric自动化部署Django项目的实现
2019/09/27 Python
pymysql的简单封装代码实例
2020/01/08 Python
高尔夫球鞋、服装、手套和装备:FootJoy
2018/12/15 全球购物
Jacadi Paris英国官网:法国童装品牌
2019/08/09 全球购物
建筑公司文秘岗位职责
2013/11/29 职场文书
工程技术员岗位职责
2014/03/02 职场文书
欢迎横幅标语
2014/06/17 职场文书
学习十八大的心得体会
2014/09/12 职场文书
普通党员对照检查材料
2014/09/24 职场文书
基层干部个人对照检查及整改措施
2014/10/28 职场文书
社区工作者个人总结
2015/02/28 职场文书
2015年学校禁毒工作总结
2015/05/27 职场文书
Python中第三方库Faker的使用详解
2022/04/02 Python
vscode远程免密登入Linux服务器的配置方法
2022/06/28 Servers