javascript高程笔记-------第四章 变量、作用域和内存问题
首先JavaScript中的变量分为基本类型和引用类型。
基本类型就是保存在栈内存中的简单数据段,而引用类型指的是那些保存在堆内存中的对象。
1.参数传递
javascript中所有参数的传递都是值传递。
1.1 基本数据类型的传递(undefined ,Null,Boolean,number,String)
1--->var money = 10;
2--->var t=function (money){
money = 5;
alert(money); //5
}
3--->t(money);
4--->alert(money); //10
执行过程 ①全局环境中初始化money的值 为10 ; ②创建函数 t 的执行环境 ;③ 执行 t 函数 复制全局环境中money的变量的值 赋值给 t 函数中的money 函数体内的money被改变 为5 然后再执行④ 全局中的money值依然为10
1.2 对象的传递 (传递是对象的引用地址)
1--->var person = new Object();
2--->var student = person;
3--->student.name = "zhangsan";
4--->alert(person.name); // zhangsan
执行过程 ①全局环境中初始化person ,person引用了栈区的一个空对象 ; ②将person引用的对象地址值复制一份 赋值给student ;③ 将student引用的对象中添加name属性 赋值为 zhangsan ④ 由于student和person引用的是同一个对象 所以值为 zhangsan!
示例图

1.2 没有块级作用域
javascript 中的 if 和 for循环 内部定义的变量 将会扩充至作用域链的上一层 变量
示例 : for循环内部定义的b和i 在aa函数中 依然可以被访问到
function aa(){
for(var i=0; i<5;i++){
var b = i;
}
alert(i) ; //5
alert(b); //4
}
1.3 变量、查询标识符
声明方式: ①使用var 关键字 此时变量的作用范围默认在当前执行环境内部 ② 不使用var 那么这个变量将存在余全局windon对象当中
当某个函数 引用一个变量时 ,必须通过搜索来确定引用变量的值,搜索过程从当前的执行环境逐步向上寻找整个作用域链 ,找到了该变量的定义则使用已定义的值,如未找到则认为该变量的值为undefined ,
var b = 5;
function a(){
alert(b); //5
}
当 执行环境内部与作用域链中 存在同名变量时候 则使用离执行环境最近的值
var b = 5;
function a(){
var b=10;
alert(b); //10
}
1.4 垃圾回收
javascript具有自动收集垃圾机制,但不同的浏览器有不同的实现方式
① 标记清除(mark-and-sweep),当变量进入执行环境(函数体内声明一个变量) 就将这个变量标记“进入环境”,而当变量离开环境时(0函数体执行完毕)标记“离开环境” ,大部分浏览器都是使用此方式进行垃圾回收 (截至2008年,IE,Firefox,Opera,Chrome,Safari)或类似回收策略,回收时间的周期不同而已
②引用计数 (reference counting): 当声明一个变量a ,将这个变量a赋值给另外一个变量b时 变量a被引用次数+1,当又将a的值赋给其他变量c时 ,a被引用的次数再+1,当程序继续执行 变量c的值 引用其他值时 ,则变量a的引用次数-1,再然后 变量b的值也不等于变量a时 ,变量a被引用的次数再-1
当引用次数为0时,说明不会再有任何执行环境需要变量a,因此就可以回收其占用的内存,
引用计数带来的问题---------当存在互相引用时(循环引用),将无法回收被占用的内存,导致内存泄漏
function a(){
var element = document.getElementById("somthingElement");
var myObject = new Object();
myObject.element = element;
element.someObject = myObject;
}
此时 a() 函数执行完毕后 element 与myObject互相引用 两者的引用次数都为1 因此无法释放其占用的内存 ,
不管浏览器采用如何的垃圾回收策略,程序内部最好的解决方式仍然是手动解除对象的引用:
function a(){
var element = document.getElementById("somthingElement");
var myObject = new Object();
myObject.element = element;
element.someObject = myObject;
//coding.....
myObject.element = null;
element.myObject = null;
}
javascript高程笔记-------第四章 变量、作用域和内存问题的更多相关文章
- 读书笔记 - js高级程序设计 - 第四章 变量 作用域 和 内存问题
5种基本数据类型 可以直接对值操作 判断引用类型 var result = instanceof Array 执行环境 每个执行环境都有一个与之关联的变量对象,环境中定义的所有变量和函数都保存在这 ...
- JAVASCRIPT高程笔记-------第五章 引用类型
一.Object类型 1.1创建方式 ①new关键字 : var person = new Oject(); ②给定直接量: var person = { name : "zhangsan& ...
- JAVASCRIPT高程笔记-------第 七章 函数表达式
7.1递归 经典递归例子 function factorial(num){ if(num <= 1){ return 1; }else{ return num * factorial(num - ...
- JavaScript高级程序设计学习笔记第四章--变量、作用域和内存问题
1.变量可能包含两种不同数据类型的值:基本类型值和引用类型值. 基本类型值指的是简单的数据段,而引用类型值指那些可能由多个值构成的对象. 2.变量复制 如果从一个变量向另一个变量复制基本类型的值,会在 ...
- javascript高级程序设计第四章 变量、作用域和内存问题
变量包含两种,,基本类型和引用类型 基本类型是指一些简单的字段: 引用类型是☞由多个值构成的对象 引用类型的值是保存在内存中的对象,在javascript中是不允许直接访问内存中的位置; 函数的参数 ...
- JAVASCRIPT高程笔记-------第六章 面向对象的程序设计
理解对象的概念 js中的对象与其他 编程语言中的类不一样 ECMAscript 没有类的概念 ECMA-262 把对象定义为 “无序属性的集合,其属性可以包含基本值,对象或者函数” ...
- javascript高级程序设计第3版——第4章 变量作用域以及内存
- Android群英传笔记——第四章:ListView使用技巧
Android群英传笔记--第四章:ListView使用技巧 最近也是比较迷茫,但是有一点点还是要坚持的,就是学习了,最近离职了,今天也是继续温习第四章ListView,也拖了其实也挺久的了,list ...
- 第一百零六节,JavaScript变量作用域及内存
JavaScript变量作用域及内存 学习要点: 1.变量及作用域 2.内存问题 JavaScript的变量与其他语言的变量有很大区别.JavaScript变量是松散型的(不强制类型)本质,决定了它只 ...
随机推荐
- SNMP 配置
http://blog.sina.com.cn/s/blog_593bf1da0100xsvu.html
- [Angular Directive] Combine HostBinding with Services in Angular 2 Directives
You can change behaviors of element and @Component properties based on services using @HostBinding i ...
- php实现栈的压入、弹出序列(**)(算法步骤)(画图)
php实现栈的压入.弹出序列(**)(算法步骤)(画图) 一.总结 1.算法步骤:一定要把算法步骤写下来,要不然太浪费时间了,尤其是思维不清晰的时候,尤其是题目有难度的时候,不然的话也非常容易出现低级 ...
- 结构体(struct)与类(class)
在 C++ 的范畴里,除了 struct 结构体不支持访问权限修饰符(private.protected.public)外,已不再区分二者的其他方面语法上的差异. 因此,在 C++ 编程中,如果一个类 ...
- 阿里云Java镜像:基本配置和总体说明
本文中的内容,来自阿里云镜像系统自带的说明. 下次不想用镜像了,感觉也没有节省多少工作量. 一.软件 1.nginx /usr/local/nginx 2.tomcat-7 /var/tomcat/ ...
- JAVA中String类的intern()方法的作用
一般我们变成很少使用到 intern这个方法,今天我就来解释一下这个方法是干什么的,做什么用的 首先请大家看一个例子: public static void main(String[] args) t ...
- 西方教育骗局,终于明白精英和普通人的残酷差别!(该校流传着一个数字——4。即“4小时睡眠、4杯咖啡、GPA4.0”——要想获得满分为4分的成绩,每天只睡4个小时,困了就喝4大杯咖啡)
2018-02-14 00:00英国/私立学校 你不知道的是:西方教育通过一个宽松的过程,偷偷完成了社会分层. 1 “中国学生真是太苦了!”我的同学李女士总是发出这样的感慨. 李女士是我中学同学,在一 ...
- CodeBlocks环境搭建及创建第一个C++程序
某业界大牛推荐最佳的途径是从raytracing入门,所以本屌开始学习<Ray Tracing In One Weekend>. 该书是基于C++的.本屌从未学过C++.感觉告诉我,要先搭 ...
- C#高效率复制对象
高效率复制对象 1.需求 在代码中经常会遇到需要把对象复制一遍,或者把属性名相同的值复制一遍. 比如: public class Student { public int Id { get; set; ...
- Windows下MinGW跨平台编译和使用log4cpp
Log4cpp 是C++开源日志库,为 C++ 应用程序开发中提供了日志的追踪和调试功能,基于 LGPL 开源协议,移植自 java 的日志项目 log4j, 并在 api 上保持了一致性. 1. 环 ...