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)-变量、作用域和内存问题的更多相关文章

  1. 《JavaScript 高级程序设计》读书笔记四 变量 作用域 内存

    一   变量(基本类型和引用类型) a.基本类型保存值,保存在栈内存,引用类型保存指针,保存在堆内存: b.所有函数的参数都是按值进行传递的,不管参数是何种类型: c.检测类型 typeof     ...

  2. 第一百零六节,JavaScript变量作用域及内存

    JavaScript变量作用域及内存 学习要点: 1.变量及作用域 2.内存问题 JavaScript的变量与其他语言的变量有很大区别.JavaScript变量是松散型的(不强制类型)本质,决定了它只 ...

  3. 《疯狂Java:突破程序员基本功的16课》读书笔记-第一章 数组与内存控制

    很早以前就听过李刚老师的疯狂java系列很不错,所以最近找一本拿来拜读,再此做下读书笔记,促进更好的消化. 使用Java数组之前必须先对数组对象进行初始化.当数组的所有元素都被分配了合适的内存空间,并 ...

  4. 《Linux内核设计与实现》读书笔记(十二)- 内存管理【转】

    转自:http://www.cnblogs.com/wang_yb/archive/2013/05/23/3095907.html 内核的内存使用不像用户空间那样随意,内核的内存出现错误时也只有靠自己 ...

  5. 《深入java虚拟机》读书笔记之垃圾收集器与内存分配策略

    前言 该读书笔记用于记录在学习<深入理解Java虚拟机--JVM高级特性与最佳实践>一书中的一些重要知识点,对其中的部分内容进行归纳,或者是对其中不明白的地方做一些注释.主要是方便之后进行 ...

  6. JavaScript解析顺序和变量作用域

    JavaScript基础之变量作用域. 一. 1.全局变量:全局变量的意思就是,在代码的不论什么地方都能够訪问到.注意:未定义 直接赋值的变量拥有全局属性. 2.局部变量:局部变量的意思就是,变量的作 ...

  7. 《疯狂Java:突破程序员基本功的16课》读书笔记-第二章 对象与内存控制

    Java内存管理分为两个方面:内存分配和内存回收.这里的内存分配特指创建Java对象时JVM为该对象在堆内存中所分配的内存空间.内存回收指的是当该Java对象失去引用,变成垃圾时,JVM的垃圾回收机制 ...

  8. 数据结构与算法JavaScript 读书笔记

    由于自己在对数组操作这块比较薄弱,然后经高人指点,需要好好的攻读一下这本书籍,原本想这个书名就比较高深,这下不好玩了.不过看着看着突然觉得讲的东西都比较基础.不过很多东西,平时还是没有注意到,故写出读 ...

  9. javaScript的闭包 js变量作用域

    js的闭包 js的变量作用域: var a=90; //定义一个全局变量 function test(){ a=123; //使用外层的 a变量 } test(); document.write(&q ...

随机推荐

  1. pip安装 Tensorflow 安装包

    最简单的 Tensorflow 的安装方法是在 pip 一键式安装官方预编译好的包 pip install tensorflow通常这种预编译的包的编译参数选择是为了最大兼容性而不是为了最优性能,导致 ...

  2. 应用gulp工具构建个自动算rem布局的小例子

    因为最近可能需要做移动端rem布局,因为rem布局需要将px转化成rem,如果次都需要拿计算器算就太low了,所以就想到用less和gulp. 因为也是初学gulp,站点的文件结构还没想到太好,也只是 ...

  3. 一款手机端的日历插件ICalendar.js

    我的网盘:http://pan.baidu.com/s/1jIib2Ay

  4. ListView列表刷新方法的区别

    ListView列表刷新方法的区别 ListView对象的刷新方法: listNote.invalidate();重绘所有组件listNote.invalidateViews();重绘组件[包含所有的 ...

  5. linux内核中打印栈回溯信息 - dump_stack()函数分析【转】

    转自:http://blog.csdn.net/jasonchen_gbd/article/details/45585133 版权声明:本文为博主原创文章,转载请附上原博链接.   目录(?)[-] ...

  6. Pollard_rho定理 大数的因数个数 这个板子超级快

    https://nanti.jisuanke.com/t/A1413 AC代码 #include <cstdio> #include <cstring> #include &l ...

  7. IDEA重新打jar包时报错MANIFEST.MF already exists in VFS

    报错原因:曾经打过jar包了,把之前的包删掉无用,VFS:虚拟文件系统.即使删掉之前的包,信息依然会在此处.故删掉MANIFEST文件夹,重新打包即可解决.

  8. 快速构造FFT/NTT

    @(学习笔记)[FFT, NTT] 问题概述 给出两个次数为\(n\)的多项式\(A\)和\(B\), 要求在\(O(n \log n)\)内求出它们的卷积, 即对于结果\(C\)的每一项, 都有\[ ...

  9. IntelliJ IDEA重构技巧收集

    https://segmentfault.com/a/1190000002488608(重命名文件) http://www.jianshu.com/p/ab298b46bf50(快速生成方法) htt ...

  10. 【前台 ajax】前台ajax请求,地址正确,但是报错不进入后台

    前台ajax请求,地址正确,但是报错不进入后台 出现上述问题,可能的情况是 1.ajax用的post,而后台限定用get,或者所有的post请求都被拦截,所以不能正常进入并且报错403 @Reques ...