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 相关文章推荐
CodeMirror2 IE7/IE8 下面未知运行时错误的解决方法
Mar 29 Javascript
一个CSS+jQuery实现的放大缩小动画效果
Feb 19 Javascript
让checkbox不选中即将选中的checkbox不选中
Jul 11 Javascript
JS实现漂亮的窗口拖拽效果(可改变大小、最大化、最小化、关闭)
Oct 10 Javascript
非常实用的12个jquery代码片段
Nov 02 Javascript
js实现各种复制到剪贴板的方法(分享)
Oct 27 Javascript
微信小程序 获取微信OpenId详解及实例代码
Oct 31 Javascript
Angular JS 生成动态二维码的方法
Feb 23 Javascript
vue-router单页面路由
Jun 17 Javascript
浅谈Angular路由守卫
Aug 26 Javascript
vue父组件点击触发子组件事件的实例讲解
Feb 08 Javascript
JS左右无缝轮播功能完整实例
May 16 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
造势之举?韩国总统候选人发布《星际争霸》地图
2017/04/22 星际争霸
php中通过curl smtp发送邮件
2012/06/05 PHP
深入PHP获取随机数字和字母的方法详解
2013/06/06 PHP
php中简单的对称加密算法实现
2017/01/05 PHP
关于php 高并发解决的一点思路
2017/04/16 PHP
Laravel 中使用 Vue.js 实现基于 Ajax 的表单提交错误验证操作
2017/06/30 PHP
google 搜索框添加关键字实现代码
2010/04/24 Javascript
基于jquery的高性能td和input切换并可修改内容实现代码
2011/01/09 Javascript
JQuery入门——用bind方法绑定事件处理函数应用介绍
2013/02/05 Javascript
jQuery显示和隐藏 常用的状态判断方法
2015/01/29 Javascript
ECMAScript6函数剩余参数(Rest Parameters)
2015/06/12 Javascript
整理AngularJS中的一些常用指令
2015/06/16 Javascript
angularJS与bootstrap结合实现动态加载弹出提示内容
2015/10/16 Javascript
javascript实现二级级联菜单的简单制作
2015/11/19 Javascript
如何解决手机浏览器页面点击不跳转浏览器双击放大网页
2016/07/01 Javascript
Webpack打包css后z-index被重新计算的解决方法
2017/06/18 Javascript
VueJS 集成 Medium Editor的示例代码 (自定义编辑器按钮)
2017/08/24 Javascript
深入掌握 react的 setState的工作机制
2017/09/27 Javascript
深入理解 webpack 文件打包机制(小结)
2018/01/08 Javascript
vue 表单输入格式化中文输入法异常问题
2018/05/30 Javascript
vue异步加载高德地图的实现
2018/06/19 Javascript
vue+echarts实现动态绘制图表及异步加载数据的方法
2018/10/17 Javascript
js实现多图和单图上传显示
2019/12/18 Javascript
[02:36]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Magma 选手采访
2021/03/11 DOTA
打开电脑上的QQ的python代码
2013/02/10 Python
Python实现批量下载文件
2015/05/17 Python
Python用imghdr模块识别图片格式实例解析
2018/01/11 Python
Python读取系统文件夹内所有文件并统计数量的方法
2018/10/23 Python
利用Node实现HTML5离线存储的方法
2020/10/16 HTML / CSS
中国排名第一的外贸销售网站:LightInTheBox.com(兰亭集势)
2016/10/28 全球购物
最新党员思想汇报
2014/01/01 职场文书
《蓝色的树叶》教学反思
2014/02/24 职场文书
平面设计求职信
2014/03/10 职场文书
张家口市高新区党工委群众路线教育实践活动整改方案
2014/10/25 职场文书
珍爱生命主题班会
2015/08/13 职场文书
导游词之江南园林狮子林
2019/09/16 职场文书