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 相关文章推荐
学习ExtJS fit布局使用说明
Oct 08 Javascript
Jquery Ajax学习实例3 向WebService发出请求,调用方法返回数据
Mar 16 Javascript
url 编码 js url传参中文乱码解决方案
Apr 11 Javascript
通过jquery的$.getJSON做一个跨域ajax请求试验
May 03 Javascript
THREE.JS入门教程(6)创建自己的全景图实现步骤
Jan 25 Javascript
jQuery Mobile的loading对话框显示/隐藏方法分享
Nov 26 Javascript
使用AngularJS和PHP的Laravel实现单页评论的方法
Jun 19 Javascript
js实现iPhone界面风格的单选框和复选框按钮实例
Aug 18 Javascript
ECMAScript6快速入手攻略
Jul 18 Javascript
微信小程序 引入es6 promise
Apr 12 Javascript
详解Express笔记之动态渲染HTML(新手入坑)
Dec 13 Javascript
我要点爆”微信小程序云开发之项目建立与我的页面功能实现
May 26 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
Windows下PHP5和Apache的安装与配置
2006/09/05 PHP
dedecms 批量提取第一张图片最为缩略图的代码(文章+软件)
2009/10/29 PHP
PHP_SELF,SCRIPT_NAME,REQUEST_URI区别
2014/12/24 PHP
php基于Fleaphp框架实现cvs数据导入MySQL的方法
2016/02/23 PHP
PHP6连接SQLServer2005的三部曲
2016/04/15 PHP
php中的buffer缓冲区用法分析
2019/05/31 PHP
laravel 执行迁移回滚示例
2019/10/23 PHP
yii2.0框架实现上传excel文件后导入到数据库的方法示例
2020/04/13 PHP
js prototype 格式化数字 By shawl.qiu
2007/04/02 Javascript
JS比较两个时间大小的简单示例代码
2013/12/20 Javascript
AngularJS之依赖注入模拟实现
2016/08/19 Javascript
jQuery实现返回顶部按钮和scroll滚动功能[带动画效果]
2017/07/05 jQuery
完美解决手机浏览器顶部下拉出现网页源或刷新的问题
2017/11/30 Javascript
js实现一个简单的MVVM框架示例
2018/01/15 Javascript
karma+webpack搭建vue单元测试环境的方法示例
2018/05/24 Javascript
详解Node.js读写中文内容文件操作
2018/10/10 Javascript
Vue插值、表达式、分隔符、指令知识小结
2018/10/12 Javascript
vue实现的网易云音乐在线播放和下载功能案例
2019/02/18 Javascript
Angular使用ControlValueAccessor创建自定义表单控件
2019/03/08 Javascript
Vue+Express实现登录状态权限验证的示例代码
2019/05/05 Javascript
原生js实现的移动端可拖动进度条插件功能详解
2019/08/15 Javascript
jQuery实现点击滚动到指定元素上的方法分析
2020/03/19 jQuery
Js实现粘贴上传图片的原理及示例
2020/12/09 Javascript
关于Python数据结构中字典的心得
2017/12/04 Python
Python 动态变量名定义与调用方法
2020/02/09 Python
Python容器类型公共方法总结
2020/08/19 Python
法学毕业生自我鉴定
2013/11/08 职场文书
群众路线教育实践活动思想汇报(2014特荐篇)
2014/09/16 职场文书
2014年手术室工作总结
2014/11/26 职场文书
毕业论文致谢范文
2015/05/14 职场文书
教师节老师寄语
2015/05/28 职场文书
2015年第31个教师节致辞
2015/07/31 职场文书
煤矿隐患排查制度
2015/08/05 职场文书
周一问候语大全
2015/11/10 职场文书
生产实习心得体会范文
2016/01/22 职场文书
SpringBoot 集成Redis 过程
2021/06/02 Redis