JavaScript读书笔记(4)-变量、作用域和内存问题
1、ECMAScript数据类型分为:基本类型值和引用类型值;
ECMAScript中所有函数的参数都是按值传递的;
检查对象的类型:varible instanceof constructor
Alert(person instanceof Object);
2、 执行环境和变量
每个执行环境都有一个与之关联的变量对象,环境中定义的所有变量和函数都保存在这个对象中;
全局执行环境是最外围的一个指定环境,在web浏览器中,全局执行环境是window对象,所有的全局变量和函数都是window对象的属性和方法;代码执行完毕,环境被销毁;
每个函数都有自己的执行环境,当执行流进入一个函数时,函数的环境就会被推入一个环境栈中,而在函数执行之后,栈将其环境弹出,把控制权返回给之前的执行环境;
当代码在一个环境中执行时,会创建变量对象的一个作用域链(scope chain)。它保证对执行环境有权访问的所有变量和函数的有序访问,作用域链的前端,始终都是当前执行的代码所在环境的变量对象。如果这个环境是函数,则将其活动对象作为变量对象,活动对象在最开始时只包含一个变量,即arguments对象,作用域链中的下一个变量对象来自包含环境,而再下一个变量对象则来自下一个包含环境,这样,一直延续到全局执行环境;全局执行环境的变量对象始终都是作用域链中的最后一个对象;
标识符解析是沿着作用域链一级一级地搜索标识符的过程;
(1) 延长作用域链
有些语句可以再作用域链的前端临时增加一个变量对象,该变量对象会在代码执行后被移除;
try-catch语句的catch块:会创建一个新的变量对象,其中包含的是被抛出的错误对象的声明;
with语句:会将制定的对象添加到作用域链中;
(2) 没有块级作用域
声明变量,使用var的变量会自动被添加到最接近的环境中;初始化变量时没有使用var,该变量会自动被添加到全局环境;
不声明而直接初始化变量时一个常见的错误做法,在严格模式下,初始化未经声明的变量会导致错误;
查询标识符,从作用域链的前端开始,向上逐级查询与给定名字匹配的标识符,如果在局部环境中找到,搜索停止,如果在局部环境中没找到变量,则继续沿作用域链向上搜索,搜索过程将一直追溯到全局环境的变量对象;
变量查询的代价是,访问局部变量要比访问全局变量更快;
3、 垃圾收集
(1) JavaScript具有自动垃圾收集机制,执行环境会负责管理代码执行过程中使用的内存;
原理:找出那些不再继续使用的变量,然后释放其占用的内存,垃圾收集器会按照固定的时间间隔(或代码执行中预定的收集时间),周期性地执行这一操作;
(2) 垃圾收集器必须跟踪哪个干粮有用哪个变量没用,对于不再有用的变量打上标记,以备将来收回其占用的内存,用于标识无用变量的策略常见的有两种:标记清除和引用计数;
(3) 标记清除,当变量进入环境时,将这个变量标记为“进入环境”,当变量离开环境时,则将其标记为“离开环境”;
垃圾收集器在运行的时候会给存储在内存中的所有变量都加上标记,然后,它会去掉环境中的变量以及被环境中的变量引用的变量的标记,而在此之后再被加上标记的变量将被视为准备删除的变量,环境中的变量已经无法访问到这些变量了,最后垃圾收集器完成清除工作,销毁那些带标记的值并回收它们所占用的内存空间;大部分浏览器都是使用的这种策略;
(4) 引用计数,跟踪记录每个值被引用的次数,当声明了一个变量并将一个引用类型值赋给该变量时,引用次数加1,相反,如果包含这个值引用的变量又取得了另外一个值,则这个值的引用次数减1,当引用次数变为0时,就可以将其占用的内存空间回收回来。
存在的问题是循环引用:对象A中包含一个对象B的指针,而对象B中也包含一个指向对象A的引用;
IE中有一部分对象并不是原生的javascript对象,BOM和DOM中的对象就是使用C++以COM对象的形式实现的,而COM对象的垃圾收集机制采用的是引用计数策略。只要IE中涉及COM对象,就会存在循环引用的问题。
Var elemen=document.getElementById(“some_element”);
Var myObject=new Object();
myObject=new Object();
element.someObject=myObject;
上面代码中一个DOM元素(element)与一个原生JavaScript对象(myObject)之间创建了循环引用;
为了避免此类问题,最好是在不适用它们的时候手工断开原生javascript对象与DOM元素之间的连接;
myObject.element=null;
element.someObject=null;
(5) 垃圾收集器是周期性运行的,如果为变量分配的内存数量很客观,那么回收工作量是相当大的,确定垃圾收集的时间间隔是很重要的问题;
Javascript引擎的垃圾收集例程工作方式:触发垃圾收集的变量分配、字面和数组元素的临界值为动态修正;
管理内存,优化内存占用的最佳方式:为执行中的代码只保存必要的数据,一旦数据不再有用,最好将其设置为null来释放其引用,其实就是解除引用;这一用法适用于大多数全局变量和全局对象的属性;
JavaScript读书笔记(4)-变量、作用域和内存问题的更多相关文章
- 《JavaScript 高级程序设计》读书笔记四 变量 作用域 内存
一 变量(基本类型和引用类型) a.基本类型保存值,保存在栈内存,引用类型保存指针,保存在堆内存: b.所有函数的参数都是按值进行传递的,不管参数是何种类型: c.检测类型 typeof ...
- 第一百零六节,JavaScript变量作用域及内存
JavaScript变量作用域及内存 学习要点: 1.变量及作用域 2.内存问题 JavaScript的变量与其他语言的变量有很大区别.JavaScript变量是松散型的(不强制类型)本质,决定了它只 ...
- 《疯狂Java:突破程序员基本功的16课》读书笔记-第一章 数组与内存控制
很早以前就听过李刚老师的疯狂java系列很不错,所以最近找一本拿来拜读,再此做下读书笔记,促进更好的消化. 使用Java数组之前必须先对数组对象进行初始化.当数组的所有元素都被分配了合适的内存空间,并 ...
- 《Linux内核设计与实现》读书笔记(十二)- 内存管理【转】
转自:http://www.cnblogs.com/wang_yb/archive/2013/05/23/3095907.html 内核的内存使用不像用户空间那样随意,内核的内存出现错误时也只有靠自己 ...
- 《深入java虚拟机》读书笔记之垃圾收集器与内存分配策略
前言 该读书笔记用于记录在学习<深入理解Java虚拟机--JVM高级特性与最佳实践>一书中的一些重要知识点,对其中的部分内容进行归纳,或者是对其中不明白的地方做一些注释.主要是方便之后进行 ...
- JavaScript解析顺序和变量作用域
JavaScript基础之变量作用域. 一. 1.全局变量:全局变量的意思就是,在代码的不论什么地方都能够訪问到.注意:未定义 直接赋值的变量拥有全局属性. 2.局部变量:局部变量的意思就是,变量的作 ...
- 《疯狂Java:突破程序员基本功的16课》读书笔记-第二章 对象与内存控制
Java内存管理分为两个方面:内存分配和内存回收.这里的内存分配特指创建Java对象时JVM为该对象在堆内存中所分配的内存空间.内存回收指的是当该Java对象失去引用,变成垃圾时,JVM的垃圾回收机制 ...
- 数据结构与算法JavaScript 读书笔记
由于自己在对数组操作这块比较薄弱,然后经高人指点,需要好好的攻读一下这本书籍,原本想这个书名就比较高深,这下不好玩了.不过看着看着突然觉得讲的东西都比较基础.不过很多东西,平时还是没有注意到,故写出读 ...
- javaScript的闭包 js变量作用域
js的闭包 js的变量作用域: var a=90; //定义一个全局变量 function test(){ a=123; //使用外层的 a变量 } test(); document.write(&q ...
随机推荐
- P1260 工程规划 (差分约束)
题目链接 Solution 差分约束. 差分约束似乎精髓就两句话: 当我们把不等式整理成 \(d[a]+w<=d[b]\) 时,我们求最长路. 整理成 \(d[a]+w>=d[b]\) 时 ...
- 解决c#所有单线程单元(STA)线程都应使用泵式等待基元(如 CoWaitForMultipleHandles),并在运行时间很长的操作过程中定期发送消息。 转载
最近做一个后来程序,启动了事务后有一段操作业务,当运行一段时间后,出现这个异常 CLR 无法从 COM 上下文 0x1b1c38 转换为 COM 上下文 0x1b1da8,这种状态已持续 60 秒.拥 ...
- SPOJ QTREE4 - Query on a tree IV
You are given a tree (an acyclic undirected connected graph) with N nodes, and nodes numbered 1,2,3. ...
- HDU 4749: Parade Show
看大神代码,发现上交大神很棒的一个思路 题意: 在源数字串中找出尽量多的连续子串,要求子串任意两值的大小关系与目标串相同位置的值的大小关系相同.求源串能拿出的子串的最大数量. 关键词: RK-Hash ...
- VUE之Router命令行警告:Named Route 'Home' has a default child route. 解决办法
Named Route 'Home' has a default child route. When navigating to this named route (:to="{name: ...
- Codeforces Round #321 (Div. 2) Kefa and Company 二分
原题链接:http://codeforces.com/contest/580/problem/B 题意: 给你一个集合,集合中的每个元素有两个属性,$m_i,s_i$,让你求个子集合,使得集合中的最大 ...
- Codeforces 622F The Sum of the k-th Powers
Discription There are well-known formulas: , , . Also mathematicians found similar formulas for high ...
- Redis集群设计原理
---恢复内容开始--- Redis集群设计包括2部分:哈希Slot和节点主从,本篇博文通过3张图来搞明白Redis的集群设计. 节点主从: 主从设计不算什么新鲜玩意,在数据库中我们也经常用主从来做读 ...
- JDBC_完整版
1,新建WEB项目:JDBC 2,导入驱动 将mysql-connector-java-5.0.8-bin.jar包放入web-inf目录下面的lib目录中 3,新建User类,放入entity包中 ...
- 强大的开源网络侦查工具:IVRE
IVRE简介 IVRE(又名DRUNK)是一款开源的网络侦查框架工具,IVRE使用Nmap.Zmap进行主动网络探测.使用Bro.P0f等进行网络流量被动分析,探测结果存入数据库中,方便数据的查询.分 ...