JavaScript高级程序设计(第3版) 第四章(变量、作用域和内存问题)
4.1 基本类型和引用类型的值
1.基本类型的值是(简单的数据段),引用类型的值是(保存在内存中的对象)。
基本类型的值在内存中占据固定大小的空间,因此被保存在栈中。(lifo)(后进先出的数据结构)
引用类型的值保存在堆(先进先出的数据结构)中。引用存放在栈中。
2.为对象添加属性时,操作的是实际对象;复制保存时操作的 是对象引用。
3.复制变量值:①基本数据类型
var num1 = 5;
var num2 = num1; //num1与num2是完全独立的
②引用类型,复制是实际上是引用。复制结束以后,2个变量引用同一个对象。
4.当在函数内部重写 对象时,对象就变成了一个局部对象。该对象在函数执行完成以后即销毁。
function setName(obj) {
obj.name = "zds";
obj = new Object(); //重写
obj.name = "hhh";
}
var b = new Object();
setName(b);
console.log(b.name); //zds
ECMAScript 所有函数的参数都是按值传递的。(引用类型也是按值传递。上例中,对象在增加属性,操作的就是实际对象)
5.检测类型:①检测基本数据 ----typeof
②检测引用类型的数据 - instanceof
4.2 执行环境及作用域
1.①每个执行环境(每块土地)都有一个与之关联的变量对象(地主),环境中定义的变量和函数(农民和农具)都保存在这个对象中。
②web浏览器中,全局执行环境被认为是window对象。
③执行环境被销毁,保存在其中的变量和函数也随之销毁(全局环境直到应用程序退出时(例如:关闭网页或者浏览器时)才被销毁)
2.内部环境可以通过作用域链访问所有的外部环境。
3.执行环境分为,全局执行环境和函数执行环境。每进入一个新的执行环境,都会创建一个用于搜索变量和函数的作用域链;
4.3 垃圾收集
1.js具有自动垃圾收集机制。这种机制的原理是:找出那些不再继续使用的变量,然后释放其占用的内存。为此,垃圾收集器会按照固定的时间间隔周期性地执行这一操作。
2.方法:①标记清除 ②引用计数
“标记清除"是目前主流的垃圾收集算法,这种算法的思想是:给当前不使用的值加上标记,然后再回收其内存
“引用计数”是跟踪记录所有值被引用的次数。目前不推荐这种。
③引用计数会遇到循环引用的问题:
var a = new Object();
var b = new Object();
a.name = b;
b.name = a;
a和b的引用次数永远都是2。
④ie的js引擎(trident)是使用标记清除策略实现的。而非原生js对象是基于计数策略的。
4.分配给web浏览器的内存数量要比分配给桌面应用程序少。是为了安全方面的考虑,目的是为了防止js的网页耗尽全部系统内存而导致系统崩溃。
因此确保占用最少的内存可以让页面获得更好的性能。而优化内存最佳方式,就是为执行中的代码只保存必要的数据,一旦数据不再引用,最好通过将其设置为null来释放其引用。----即”解除引用“
var a = {name:“zds”}; a = null';
解除引用的真正作用是让值脱离执行环境,以便垃圾收集器下次运行时将其收回。
最新文章
- vim - save current file with a new name but keep editing current file
- 奇 arch/i386/kernel/head.o(.text+0x3e): undefined reference to `stack_start'
- 常用JQ特效代码
- Asp.net Mvc4默认权限详细(下)
- panels能否包含views_block ////// panels -- content pane 参数传递
- SQLite入门与分析(二)---设计与概念(续)
- 到目前为止,Linux下最完整的Samba服务器配置攻略
- EL表达式读取数据(在Map,javaBean,List)
- Java基础知识强化之IO流笔记08:异常的注意事项
- JAVA 操作 DBF 文件数据库
- WebIM(1)
- ad_封装_ads828
- Java自学手记——注解
- python读取外部文件
- CDOJ 1330 柱爷与远古法阵【高斯消元,卡精度】
- 解决Apache配置虚拟主机时出现403错误的问题
- 第二期,问道PC端游戏免安装,下载即可体验
- 125、Android样式的开发(转载)
- run
- 使用css实现移动端导航条滚动
热门文章
- -webkit-overflow-scrolling:touch介绍和碰到的坑
- linux相关(find/grep/awk/sed/rpm)
- IntelliJ IDEA 创建spring boot 的Hello World 项目
- Spark 计算人员三度关系
- 基于socket 实现单线程并发
- pg_dump - 将一个PostgreSQL数据库抽出到一个脚本文件或者其它归档文件中
- ubuntu18.04 设置环境变量
- Codeforces917E
- alert(1) to win 11
- alert(1) to win 6