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';
解除引用的真正作用是让值脱离执行环境,以便垃圾收集器下次运行时将其收回。
JavaScript高级程序设计(第3版) 第四章(变量、作用域和内存问题)的更多相关文章
- javascript高级程序设计第3版——第4章 变量作用域以及内存
- 《JavaScript高级程序设计》读书笔记(四)变量、作用域和内存问题
内容---理解基本类型和引用类型的值---理解执行环境---理解垃圾收集 --JavaScript变量松散类型的本质--决定了它只是在特定时间用于保存特定值的一个名字而已--变量的值及其数据类型可以在 ...
- javascript高级程序设计第3版——第10章 DOM
第十章,DOM DOM是语言中立的API,用于访问和操作HTML 和XML 文档.DOM1 级将HTML 和XML 文档形象地看作一个层次化的节点树,可以使用JavaScript 来操作这个节点树,进 ...
- javascript高级程序设计第3版——第6章 面向对象的程序设计
第六章——面向对象的程序设计 这一章主要讲述了:面向对象的语言由于没有类/接口情况下工作的几种模式以及面向对象语言的继承: 模式:工厂模式,构造函数模式,原型模式 继承:原型式继承,寄生式继承,以及寄 ...
- JavaScript高级程序设计学习笔记第十四章--表单
1.在 HTML 中,表单是由<form>元素来表示的,而在 JavaScript 中,表单对应的则是 HTMLFormElement 类型. HTMLFormElement 继承了 HT ...
- 读Javascript高级程序设计第三版第六章面向对象设计--创建对象
虽然Object构造函数或者对象字面量都可以用来创建单个对象,但是缺点非常明显:使用同一接口创建很多对象,会产生大量重复代码. 工厂模式 1 function CreatePerson(name,a ...
- javascript高级程序设计第3版——第12章 DOM2与DOM3
12章——DOM2与DOM3 为了增强D0M1,DOM级规范定义了一些模块. DOM2核心:为不同的DOM类型引入了一些与XML命名空间有关的方法,还定义了以编程方式创建Document实例的方法: ...
- javascript高级程序设计第3版——第1Java章 DOM扩展
虽然DOM 为与XML 及HTML 文档交互制定了一系列核心API,但仍然有几个规范对标准的DOM进行了扩展.这些扩展中有很多原来是浏览器专有的,但后来成为了事实标准,于是其他浏览器也都提供了相同的实 ...
- javascript高级程序设计第3版——第8章 BOM(浏览器对象模型)
第八章,浏览器对象模型 主要介绍了window的几个对象以及框架,窗口的关系,各个浏览器对象的属性以及方法:
- javascript高级程序设计第3版——第7章 函数表达式
此张内容的难点在于闭包.而闭包又涉及到原型,原型链,执行上下环境,this的取值等知识点.(此章节对于闭包的内容篇幅较少,且写的很是艰涩难懂,推荐一位大牛的博客,对于闭包的前因后果以及作用机制写的很明 ...
随机推荐
- 关于Python程序的运行方面,有什么手段能提升性能?
1.使用多进程,充分利用机器的多核性能 2.对于性能影响较大的部分代码,可以使用C或C++编写 3.对于IO阻塞造成的性能影响,可以使用IO多路复用来解决 4.尽量使用Python的内建函数 5.尽量 ...
- 广告URL
讨厌的csdn 广告,百度搜索了一次,csdn cookie广告追了你好几年还有... 把下面的url 重定向127.0.0.1 ,只记录了百度广告,部分阿里的广告,其他还未记录 虽然也用Adblo ...
- MySQL 5.7安装(linux)
https://blog.csdn.net/li_Dijkstra/article/details/79354385 https://blog.csdn.net/li_Dijkstra/article ...
- 被我误解的max_connect_errors
第一节 什么是max_connect_errors 一开始接触这个参数的时候,感觉他和max_connections的含义差不多,字面意思简单明了,这个参数的含义是最大连接错误数,翻翻mysql的文 ...
- [SheetJS] js-xlsx模块学习指南
简介 SheetJS是前端操作Excel以及类似的二维表的最佳选择之一,而js-xlsx是它的社区版本. js-xlsx将注意力集中到了数据转换和导出上,所以它支持相当多种类的数据解析和导出.不仅仅局 ...
- js中的函数声明置顶
函数声明置顶是指 js引擎在读取变量与声明式函数时,会优先读取,例如如下 var a = 1: function a(){}; console.log(a); //这里得到的为1,而不是该functi ...
- 点击按钮时,显示不同的div内容
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 没有找到<context:component-scan base-package="">标签
<?xml version="1.0" encoding="UTF-8"?> <!-- 指定Spring配置文件的Schema信息 --> ...
- golang中读取文件
读文件 方式1 #利用ioutil.ReadFile 直接从文件读取到[]byte中# file, err := ioutil.ReadFile("file/test.txt") ...
- 01.Windows2008R2系统禁启SMBv1服务命令
微软漏洞安全问题: 检测:默认配置 = 已启用(未创建注册表项),所以不会返回 SMB1 值.Get-Item HKLM:\SYSTEM\CurrentControlSet\Services\Lanm ...