Chapter4 变量、作用域和内存问题

l  理解基本类型和引用类型的值

l  理解执行环境

l  理解垃圾收集

4.1基本类型和引用类型的值

l  ECMAScript变量包含两种不同数据类型的值:基本类型值和引用类型值。

l  在将一个值赋给变量时,解析器必须确定这个值是基本类型值还是引用类型值

l  基本类型值:简单数据段

Undefiened,Null,Boolean,Number,String(按值访问)

l  引用类型值:可能由多个值构成的对象

Object(复制时:按引用访问;增加对象属性:操作实际对象)

4.1.1动态的属性

l  对于引用类型的值,可以添加属性和方法,也可以删除属性和方法

l  对于基本类型的值,无法给其添加属性和方法(虽然不会导致任何错误)

4.1.2复制变量值

l  基本类型值:创建新值,复制到为新变量分配的位置上

特点:副本,互不影响

复制前的变量对象

Num1

5

(Number 类型)

复制后的变量对象

Num2

5

(Number 类型)

Num1

5

(Number 类型)

l  引用类型值:创建新值,复制到为新变量分配的位置上

但是创建的新值实际上是一个指针,指向存储在堆中的一个对象

特点:两个变量将引用同一个对象,互相影响

复制前的变量对象

Obj1

(Object 类型)

复制后的变量对象

4.1.3传递参数

l  访问变量:按值和按引用

l  函数参数传递:只有按值

  1. 向参数传递基本类型的值:被传递的值复制给一个局部变量(即命名参数,或者

说arguments对象中的一个元素)

2.   向参数传递引用类型的值:按值传递,虽然局部作用域中修改的对象会在全局作用域中反映出来

      

【在这个函数内部,obj和person引用的是同一个对象。换句话说,即使这个变量是按值传递的,obj也会按引用来访问一个对象。

如果person是按引用来传递的,那么person就会自动被修改为指向其name属性值为“Greg”的新对象。

实际上,当在函数内部重写obj时,这个变量引用的就是一个局部对象了。而这个局部对象会在函数执行完毕后被立即销毁。】

4.1.4检测类型

l  检测基本类型(undefined,字符串,数字,布尔值):tpyeof

l  检测引用类型:instanceof

如果变量是给定引用类型(根据它的原型链来识别)的实例,instanceof操作符返回true

4.2执行环境及作用域

l  执行环境:定义了变量和函数有权访问的其他数据,决定了它们各自的行为。

1. 每个执行环境都有一个与之关联的变量对象

2. 全局执行环境是最外围的一个执行环境

(根据ECMAScript实现所在的宿主环境不同,表示执行环境的对象也不一样。在web浏览器中,全局执行环境被认为是window对象。所有的全局变量和函数都是作为window对象的属性和方法)

3. 每个函数都有自己的执行环境。

当执行流进入一个函数,函数的环境被推入一个环境栈中。而在函数执行之后,栈将其环境弹出,把控制权返回给之前的执行环境。

l  变量对象(variable object):保存执行环境中定义的所有变量和函数

l  作用域链(scope chain):保证对执行环境有权访问的所有变量和函数的有序访问

1. 当代码在一个环境中执行时,会创建变量对象的一个作用域链。作用域链的前端,都是当前执行代码所在环境的变量对象。

2. 作用域链中的下一个变量对象来自包含环境,而再下一个变量对象则来自下一个包含环境。这样,一直延续到全局执行环境;全局执行环境的变量对象始终都是作用域链中的最后一个对象。

内部环境可以通过作用域链访问所有外部环境,但外部环境不能内部环境中的任何变量和函数。这些环境之间的联系是线性,有序的。

4.2.1延长作用域链

l  有些语句可以在作用域链的前端临时增加一个变量对象,该变量对象会在代码执行后被移除。也就是说当执行流进入时,作用域链会得到加成

l  加成作用域链

1. Try-catch语句的catch块

对于catch语句来说,会创建一个新的变量对象,其中包含的是被抛出的错误对象的声明。

2. With语句

对with语句来说,会将指定的对象添加到作用域链中

With语句的变量对象就包含了location对象的所有属性和方法

4.2.2没有块级作用域

l  类C语言中,有花括号封闭的代码块都有自己的作用域,因而支持根据条件来定义变量

l  对于JavaScript,没有块级作用域。

For语句初始化变量的表达式所定义的变量,if语句中的变量声明在执行结束后,也依旧会存在于对应的外部执行环境中。

1. 声明变量

l  使用var声明的变量会自动被添加到最接近的环境中。

函数内部:最接近的环境:函数的局部环境

With语句:函数环境

l  没有使用var声明,自动添加到全局环境

2.查询标识符

沿着作用域链一级一级地搜索。搜索过程始终从作用域的前端开始,然后逐级地向后回溯,直至找到标识符为止。(如果找不到标识符,通常会导致错误发生)

也就是说,如果局部环境中存在同名标识符,就不会使用父环境中的标识符。

4.3垃圾收集

l  JavaScript具有自动垃圾收集机制,执行环境会复制管理代码执行过程中使       用的内存。所以开发人员不再关心内存问题。

l  垃圾收集机制原理:找出不再继续使用的变量,然后释放其占用的内存。

垃圾收集器会按照固定时间间隔(或代码执行中预定的收集时间)周期性地执行这一操作。

4.3.1标记清除(mark-and-sweep)

l  JavaScript最常用的垃圾收集方式。可通过任何方式来标记变量。

(翻转某个特殊的位,“进入环境”变量列表,“离开环境”变量列表)

l  垃圾收集器在运行的时候会给存储在内存中的所有变量都加上标记。

然后,它会去掉环境中的变量以及被环境中的变量引用的变量的标记。而在此后在被加上标记的变量将被视为准备删除的变量,原因是环境中的变量已经无法访问到这些变量了。最后,垃圾收集器完成内存清除工作,销毁那些带标记的值并回收它们所占用的内存空间。

4.3.2引用计数(reference counting)

l  引用计数:跟踪记录每个值被引用的次数。当这个值得引用次数变成0时,则说明没有办法再访问这个值了,因而就可以将其占用的内存空间回收回来。

l  规则:声明了一个变量并将一个引用类型值赋给该变量时,则这个值得引用次数为1

同一个值又被赋给另一个变量,则该值得引用次数加1

包含对这个值引用的变量又取得了另一个值,则这个值的引用次数减1

l  问题之一:循环引用

函数执行完后,objA和objB将继续存在,因为它们的引用次数永远不会是0

l  IE9之前BOM和DOM对象使用C++以COM(组件对象模型)对象的形式实现。

所以即使IE的JavaScript引擎使用标记清除策略来实现,JavaScript访问的COM对象却是基于引用计数策略。存在循环引用问题。

例子中的DOM从页面中移除,它也永远不会被回收。

IE9把BOM和DOM对象都转换成了真正的JavaScript对象。避免了两种垃圾收集算法并存导致的问题,也消除了常见的内存泄漏现象。

4.3.3性能问题

垃圾收集器是周期性运行的,垃圾收集的时间间隔是一个非常重要的问题

IE7之前的垃圾收集器根据内存分配量运行的,具有严重的性能问题。

4.3.4管理内存

l  出于安全方面的考虑,为防止运行JavaScript的网页耗尽全部系统内存而导致系统奔溃,分配给web浏览器的可用内存数量通常比分配给桌面应用程序的少

l  确保占用最少的内存可以让页面获得更好的性能——为执行中的代码只保存必要的数据。不必要的通过解除引用(dereferencing),将其值设置为null.

局部变量会在它们离开执行环境时被自动解除引用,全局变量和全局变量的属性需要手动解除引用。

l  解除一个值的引用并不意味着自动回收该值所占用的内存。解除引用的真正作用是让值脱离执行环境,以便垃圾收集器下次运行时将其回收。

JavaScript 高级程序设计(第3版)笔记——chapter4:变量、作用域和内存问题的更多相关文章

  1. javaScript高级程序设计第3版笔记

    <script src = "xxx.js" defer = "defer"> </script> 在引用外部script时,<s ...

  2. Javascript高级程序设计第三版-笔记

    1.JS数值最大值最小值: >Number.MIN_VALUE <5e-324 >Number.MAX_VALUE <1.7976931348623157e+308 判断数值是 ...

  3. JavaScript高级程序设计第三版.CHM【带实例】

    从驱动全球商业.贸易及管理领域不计其数的复杂应用程序的角度来看,说 JavaScript 已经成为当今世界上最流行的编程语言一点儿都不为过. JavaScript 是一种非常松散的面向对象语言,也是 ...

  4. JavaScript 高级程序设计 (第4版) 思维导图/脑图 All In One

    JavaScript 高级程序设计 (第4版) 思维导图/脑图 All In One JavaScript 高级程序设计 (第4版) 思维导图下载 JavaScript 高级程序设计 (第4版) 脑图 ...

  5. 《JavaScript高级程序设计》(第二版)

    这本书的作者是 Nicholas C.Zakas ,博客地址是 http://www.nczonline.net/ ,大家可以去多关注,雅虎的前端工程师,是YUI的代码贡献者,可想而知这本书得含金量, ...

  6. 【读书笔记】读《JavaScript高级程序设计-第2版》 - 函数部分

    1. 定义 函数实际上是对象,每个函数都是Function类型的实例,而且都与其他引用类型一样具有属性和方法.由于函数是对象,因此函数名实际上也是一个指向函数对象的指针,不会与某个函数绑定. 对于函数 ...

  7. 《Javascript高级程序设计第3版》精华总结

    一.JavaScript简介   1.1 javascript简史 1.2 javascript实现 + javascript是一种专为网页交互而设计的一种脚本语言,javascript由三大部分组成 ...

  8. javascript高级程序设计第三版书摘

    在HTML 中使用JavaScript <script>元素 在使用<script>元素嵌入 JavaScript 代码时,只须为<script>指定 type 属 ...

  9. 4.2 执行环境及作用域【JavaScript高级程序设计第三版】

    执行环境(execution context,为简单起见,有时也称为“环境”)是JavaScript 中最为重要的一个概念.执行环境定义了变量或函数有权访问的其他数据,决定了它们各自的行为.每个执行环 ...

  10. 【读书笔记】读《JavaScript高级程序设计-第2版》 - 非函数部分

    章节列表: 第08章:BOM 第09章:客户端检测 第10章:DOM 第11章:DOM2和DOM3 第12章:事件 第13章:表单脚本 第14章:错误处理与调试 第17章:Ajax和JSON第20章: ...

随机推荐

  1. ThinkPHP常量参考

    常用常量 APP_NAME 当前项目名称 APP_PATH 当前项目路径 GROUP_NAME 当前分组名称 MODULE_NAME 当前Action模块名称 ACTION_NAME 当前操作的名称 ...

  2. php基础知识(每天分享一些以前的笔记希望能帮助自学的朋友)

    php基础(第一天) php标签 1.  要知道php是一种嵌入html文档的脚本语言:php语法格式是:<?php 想要写的内容 ?>红色体就是php的标签,注意这些标签都要在英式输入法 ...

  3. RAW模板开发必备知识

    写这个主要是为了让已经熟练掌握PHP的人能够快速的掌握RAW模板开发,从而享受RAW的优越! (注:在实际开发中,最好注意RAW模板开发统一规范,那样可以增强用户体验) 废话不多说,进入正题. 需要记 ...

  4. pwntools安装使用方法

    pwntools是一个CTF框架和漏洞利用开发库,用Python开发,由rapid设计,旨在让使用者简单快速的编写exploit. pwntools对Ubuntu 12.04和14.04的支持最好,但 ...

  5. 在 Windows Media Center 中观看电视

    如果计算机具备了必要的硬件,则可以在电脑上使用 Windows Media Center 观看.暂停和快退直播的电视节目及录制的电视节目. 通过 Windows Media Center 观看直播电视 ...

  6. 基于Visual C++2013拆解世界五百强面试题--题15-递归相加

    有一分数序列: 1/2 , 1/4 , 1/6 , 1/8 ......,用递归的方法,求此数列20项之和. 可以看出规律:每一项位1/n*2 这个很容易些递归,但是要注意一点,使用浮点数相除保存: ...

  7. rpc的学习

    rpc(Remote process call 即远程过程调用)是一种请求-相应的协议, 主要使用于C/S架构中,使得分布式系统成为可能.由客户端发起请求,服务端调用各种参数处理请求,当服务器在处理请 ...

  8. hdoj 1874 畅通工程续(单源最短路+dijkstra)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1874 思路分析:该问题给定一个无向图.起始点和终点,要求求出从起始点到终点的最短距离: 使用Dijks ...

  9. UVa 10131: Is Bigger Smarter?

    动态规划题.类似UVa103 Stacking Box,都是题目给一种判断嵌套的方法然后求最长序列.提前对数据排序可以节省一些时间开销. 我的解题代码如下: #include <iostream ...

  10. NS2 nam中节点及数据流颜色设置

    NS2 节点颜色设置在http://hi.baidu.com/jrwen0/item/d105c642f4c3ce36fb89601b说明的比較具体,大家能够參见. 我这里想说的是数据流颜色的设置,相 ...