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 相关文章推荐
jquery中eq和get的区别与使用方法
Apr 14 Javascript
吐槽一下我所了解的Node.js
Oct 08 Javascript
javascript实现日期格式转换
Dec 16 Javascript
JS+JSP通过img标签调用实现静态页面访问次数统计的方法
Dec 14 Javascript
详解JavaScript UTC时间转换方法
Jan 07 Javascript
利用JS实现数字增长
Jul 28 Javascript
jQuery模拟实现的select点击选择效果【附demo源码下载】
Nov 09 Javascript
使用vue构建一个上传图片表单
Jul 04 Javascript
jquery在启动页面时,自动加载数据的实例
Jan 22 jQuery
vue 录制视频并压缩视频文件的方法
Jul 27 Javascript
Vue项目中使用flow做类型检测的方法
Mar 18 Javascript
vue中v-model对select的绑定操作
Aug 31 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操作文件类的函数代码(文件和文件夹创建,复制,移动和删除)
2011/11/10 PHP
使用php语句将数据库*.sql文件导入数据库
2014/05/05 PHP
getimagesize获取图片尺寸实例
2014/11/15 PHP
给大家分享几个常用的PHP函数
2017/01/15 PHP
Jquery动态进行图片缩略的原理及实现
2013/08/13 Javascript
js加入收藏以及使用Jquery更改透明度
2014/01/26 Javascript
Javascript和Java获取各种form表单信息的简单实例
2014/02/14 Javascript
javascript常见操作汇总
2014/09/03 Javascript
javascript格式化指定日期对象的方法
2015/04/21 Javascript
JavaScript判断数字是否为质数的方法汇总
2016/06/02 Javascript
domReady的实现案例
2016/11/23 Javascript
Bootstrap导航条可点击和鼠标悬停显示下拉菜单
2016/11/25 Javascript
nodejs的压缩文件模块archiver用法示例
2017/01/18 NodeJs
Javascript循环删除数组中元素的几种方法示例
2017/05/18 Javascript
原生JavaScript实现todolist功能
2018/03/02 Javascript
Vue实现搜索 和新闻列表功能简单范例
2018/03/16 Javascript
移动端滑动切换组件封装 vue-swiper-router实例详解
2018/11/25 Javascript
Vue使用mixin分发组件的可复用功能
2019/09/01 Javascript
python django 访问静态文件出现404或500错误
2017/01/20 Python
python3使用PyMysql连接mysql数据库实例
2017/02/07 Python
详解pandas使用drop_duplicates去除DataFrame重复项参数
2019/08/01 Python
Python filter()及reduce()函数使用方法解析
2020/09/05 Python
前端H5 Video常见使用场景简介
2020/08/21 HTML / CSS
英国游戏机和游戏购物网站:365games.co.uk
2018/06/18 全球购物
Linux常见面试题
2013/03/18 面试题
大学生校园创业计划书
2014/02/08 职场文书
电教室标语
2014/06/20 职场文书
咖啡店创业计划书范文
2014/09/15 职场文书
社保代办委托书怎么写
2014/10/06 职场文书
债务授权委托书范本
2014/10/17 职场文书
三峡导游词
2015/01/31 职场文书
集结号观后感
2015/06/08 职场文书
北京青年观后感
2015/06/15 职场文书
2015年防灾减灾工作总结
2015/07/24 职场文书
交通安全宣传标语(100条)
2019/08/22 职场文书
使用numpy nonzero 找出非0元素
2021/05/14 Python