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 ...
随机推荐
- [APIO2009]抢掠计划 ($Tarjan$,最长路)
题目链接 Solution 裸题诶... 直接 \(Tarjan\) 缩点+ \(SPFA\) 最长路即可. 不过在洛谷上莫名被卡... RE两个点... Code #include<bits/ ...
- Android2.2源码init机制分析
1 源码分析必备知识 1.1 linux内核链表 Linux内核链表的核心思想是:在用户自定义的结构A中声明list_head类型的成员p,这样每个结构类型为A的变量a中,都拥有同样的成员p,如下: ...
- xsy 1845 - GCD
from NOIP2016模拟题34 Description 给定一个长度\(n\le 10^6\)的序列, 给定\(A, B\) 给出一个序列,要求你通过如下两个操作使得序列中所有数的最大公约数大于 ...
- Codevs 数字三角形 问题合集
1220 数字三角形 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 如图所示的数字三角形,从顶部出发,在每一结点可以选择向左走或得 ...
- 【Vijos1534】高性能计算机(DP)
题意:有NA个A与NB个B两种任务需要完成,完成一段长度为X的A任务需要时间ta+ka*x*x,B任务类似,连续的同一种任务不能分成两段运行 有P台可以并行运算的计算机,求最快完成所有任务的时间 1≤ ...
- [专题总结]数位DP
总结: 1:第i个数符合要求了,所以接下来的数都可以.如果没限制, 那么是有 10i-1 个.如果有限制,那么是 (nowx % 10i-1)+1 . 2:两种状态设置 有设状态d ...
- AC日记——传纸条 洛谷 P1006
题目描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行n列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交谈了.幸运的是 ...
- 牛客网 牛客练习赛11 A.假的线段树
看不懂题意,而且太菜,写了两道就溜了... A.假的线段树 链接:https://www.nowcoder.com/acm/contest/59/A来源:牛客网 时间限制:C/C++ 1秒,其他语言2 ...
- BZOJ——1623: [Usaco2008 Open]Cow Cars 奶牛飞车
http://www.lydsy.com/JudgeOnline/problem.php?id=1623 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 6 ...
- luogu P2158 [SDOI2008]仪仗队
题目描述 作为体育委员,C君负责这次运动会仪仗队的训练.仪仗队是由学生组成的N * N的方阵,为了保证队伍在行进中整齐划一,C君会跟在仪仗队的左后方,根据其视线所及的学生人数来判断队伍是否整齐(如下图 ...