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 相关文章推荐
javascript针对DOM的应用分析(三)
Apr 15 Javascript
基于jQuery的获取标签名的代码
Jul 16 Javascript
通过正则格式化url查询字符串实现代码
Dec 28 Javascript
自己写的Javascript计算时间差函数
Oct 28 Javascript
javascript相等运算符与等同运算符详细介绍
Nov 09 Javascript
js如何判断输入字符串长度
Dec 16 Javascript
JQuery在循环中绑定事件的问题详解
Jun 02 Javascript
JavaScript代码实现图片循环滚动效果
Mar 19 Javascript
Kendo Grid editing 自定义验证报错提示的解决方法
Nov 18 Javascript
vue.js项目 el-input 组件 监听回车键实现搜索功能示例
Aug 25 Javascript
使用Sonarqube扫描Javascript代码的示例
Dec 26 Javascript
nuxt 每个页面head标签内容设置方式
Nov 05 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
PHP SEO优化之URL优化方法
2011/04/21 PHP
php读取csv数据保存到数组的方法
2015/01/03 PHP
PHP实现重载的常用方法实例详解
2017/10/18 PHP
PHP自定义函数实现数组比较功能示例
2017/10/19 PHP
tp5框架前台无限极导航菜单类实现方法分析
2020/03/29 PHP
javascript parseInt 大改造
2009/09/27 Javascript
详解iframe与frame的区别
2016/01/13 Javascript
jQuery的ajax下载blob文件
2016/07/21 Javascript
JavaScript程序设计高级算法之动态规划实例分析
2017/11/24 Javascript
解决vue单页路由跳转后scrollTop的问题
2018/09/03 Javascript
详解angular2如何手动点击特定元素上的点击事件
2018/10/16 Javascript
浅谈element中InfiniteScroll按需引入的一点注意事项
2020/06/05 Javascript
在Vue中使用Echarts可视化库的完整步骤记录
2020/11/18 Vue.js
[02:20]2014DOTA2西雅图邀请赛 MVP外卡赛首胜采访
2014/07/09 DOTA
[02:27]2018DOTA2亚洲邀请赛赛前采访-OpTic
2018/04/03 DOTA
python正则分组的应用
2013/11/10 Python
Python深入学习之闭包
2014/08/31 Python
Python模拟登录12306的方法
2014/12/30 Python
python复制文件的方法实例详解
2015/05/22 Python
好用的Python编辑器WingIDE的使用经验总结
2016/08/31 Python
书单|人生苦短,你还不用python!
2017/12/29 Python
python绘制立方体的方法
2018/07/02 Python
Python转换itertools.chain对象为数组的方法
2020/02/07 Python
python解释器pycharm安装及环境变量配置教程图文详解
2020/02/26 Python
Python ORM框架Peewee用法详解
2020/04/29 Python
keras训练浅层卷积网络并保存和加载模型实例
2020/07/02 Python
Python数据分析库pandas高级接口dt的使用详解
2020/12/11 Python
英国名牌服装购物网站:OD’s Designer
2019/09/02 全球购物
马歇尔耳机官网:Marshall Headphones
2020/02/04 全球购物
大学生村官工作感言
2014/01/10 职场文书
小学少先队活动方案
2014/02/18 职场文书
大学生档案自我鉴定(2篇)
2014/10/14 职场文书
六年级语文下册教学计划
2015/01/22 职场文书
百年孤独读书笔记
2015/06/29 职场文书
spring cloud 配置中心native配置方式
2021/09/25 Java/Android
Docker下安装Oracle19c
2022/04/13 Servers