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 相关文章推荐
让iframe框架网页在任何浏览器下自动伸缩
Aug 18 Javascript
jquery实现居中弹出层代码
Aug 25 Javascript
JS格式化数字保留两位小数点示例代码
Oct 15 Javascript
jquery快捷动态绑定键盘事件的操作函数代码
Oct 17 Javascript
Javascript加载速度慢的解决方案
Mar 11 Javascript
javasciprt下jquery函数$.post执行无响应的解决方法
Mar 13 Javascript
Javascript中浮点数相乘的一个解决方法
Jun 03 Javascript
jquery实现的动态回到顶部特效代码
Oct 28 Javascript
基于JavaScript实现跳转提示页面
Sep 24 Javascript
微信小程序页面开发注意事项整理
May 18 Javascript
深入了解Vue3模板编译原理
Nov 19 Vue.js
JavaScript WeakMap使用详解
Feb 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新手上路(八)
2006/10/09 PHP
php获取服务器信息的实现代码
2013/02/04 PHP
PHP闭包(Closure)使用详解
2013/05/02 PHP
PHP ajax 异步执行不等待执行结果的处理方法
2015/05/27 PHP
简单介绍PHP的责任链编程模式
2015/08/11 PHP
如何使用php等比例缩放图片
2016/10/12 PHP
PHP中的Iterator迭代对象属性详解
2019/04/12 PHP
PHP使用PhpSpreadsheet操作Excel实例详解
2020/03/26 PHP
JQuery 入门实例1
2009/06/25 Javascript
分享27个jQuery 表单插件集合推荐
2011/04/25 Javascript
JavaScript中为元素加上name属性的方法
2011/05/09 Javascript
document.getElementById获取控件对象为空的解决方法
2013/11/20 Javascript
javascript 获取网页标题代码实例
2014/01/22 Javascript
Google Maps API地图应用示例分享
2014/10/23 Javascript
详解Javascript动态操作CSS
2014/12/08 Javascript
js控制文本框只输入数字和小数点的方法
2015/03/10 Javascript
用Move.js配合创建CSS3动画的入门指引
2015/07/22 Javascript
jquery实现简单Tab切换菜单效果
2020/07/17 Javascript
jQuery Easyui使用(二)之可折叠面板动态加载无效果的解决方法
2016/08/17 Javascript
vue2.0获取自定义属性的值
2017/03/28 Javascript
更优雅的微信小程序骨架屏实现详解
2019/08/07 Javascript
微信小程序批量监听输入框对按钮样式进行控制的实现代码
2019/10/12 Javascript
JavaScript获取当前url路径过程解析
2019/12/27 Javascript
js实现幻灯片轮播图
2020/08/14 Javascript
Python中Continue语句的用法的举例详解
2015/05/14 Python
Python常见内置高效率函数用法示例
2018/07/31 Python
用Python实现将一张图片分成9宫格的示例
2019/07/05 Python
tensorflow 环境变量设置方式
2020/02/06 Python
python数据库编程 Mysql实现通讯录
2020/03/27 Python
html svg生成环形进度条的实现方法
2019/09/23 HTML / CSS
美国最大的珠宝商之一:Littman Jewelers
2016/11/13 全球购物
Java基础类库面试题
2013/09/04 面试题
小学生运动会报道稿
2014/09/12 职场文书
故意伤害罪辩护词
2015/05/21 职场文书
创业分两种人:那么哪些适合创业?,哪些适合不适合创业呢?
2019/08/23 职场文书
Elasticsearch 配置详解
2022/04/19 Java/Android