首先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高程笔记-------第四章 变量、作用域和内存问题的更多相关文章

  1. 读书笔记 - js高级程序设计 - 第四章 变量 作用域 和 内存问题

      5种基本数据类型 可以直接对值操作 判断引用类型 var result = instanceof Array 执行环境 每个执行环境都有一个与之关联的变量对象,环境中定义的所有变量和函数都保存在这 ...

  2. JAVASCRIPT高程笔记-------第五章 引用类型

    一.Object类型 1.1创建方式 ①new关键字 : var person = new Oject(); ②给定直接量: var person = { name : "zhangsan& ...

  3. JAVASCRIPT高程笔记-------第 七章 函数表达式

    7.1递归 经典递归例子 function factorial(num){ if(num <= 1){ return 1; }else{ return num * factorial(num - ...

  4. JavaScript高级程序设计学习笔记第四章--变量、作用域和内存问题

    1.变量可能包含两种不同数据类型的值:基本类型值和引用类型值. 基本类型值指的是简单的数据段,而引用类型值指那些可能由多个值构成的对象. 2.变量复制 如果从一个变量向另一个变量复制基本类型的值,会在 ...

  5. javascript高级程序设计第四章 变量、作用域和内存问题

    变量包含两种,,基本类型和引用类型 基本类型是指一些简单的字段: 引用类型是☞由多个值构成的对象  引用类型的值是保存在内存中的对象,在javascript中是不允许直接访问内存中的位置; 函数的参数 ...

  6. JAVASCRIPT高程笔记-------第六章 面向对象的程序设计

    理解对象的概念  js中的对象与其他 编程语言中的类不一样  ECMAscript 没有类的概念      ECMA-262 把对象定义为 “无序属性的集合,其属性可以包含基本值,对象或者函数”   ...

  7. javascript高级程序设计第3版——第4章 变量作用域以及内存

  8. Android群英传笔记——第四章:ListView使用技巧

    Android群英传笔记--第四章:ListView使用技巧 最近也是比较迷茫,但是有一点点还是要坚持的,就是学习了,最近离职了,今天也是继续温习第四章ListView,也拖了其实也挺久的了,list ...

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

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

随机推荐

  1. ExtJS中store.findExact

    var ds = myGrid.apf_ds; var store = myGrid.getStore(); forEach(data, function (item) { if (store.fin ...

  2. css3-5 css3鼠标、列表和尺寸样式怎么用(文字有关的样式会被继承)

    css3-5  css3鼠标.列表和尺寸样式怎么用(文字有关的样式会被继承) 一.总结 一句话总结:css标签中文字有关的样式会被继承.由常用样式记起. 1.鼠标常用样式有哪些? cursor:poi ...

  3. css3-1 css3游戏介绍、css3样式和优先级

    css3-1 css3游戏介绍.css3样式和优先级 一.总结 一句话总结:我们写外部css表的时候可以用class,那样使用的人用id修改的话优先级就比我们高,达到目的. 1.html嵌套css样式 ...

  4. Android中动态设置GridView的列数、列宽和行高

    在使用GridView时我们知道,列数是可以通过设计时的属性来设置的,列的宽度则是根据列数和GridView的宽度计算出来的.但是有些时候我们想实现列数是动态改变的效果,即列的宽度保持某个值,列的数量 ...

  5. uml精粹——11.活动图(及整个读书笔记分享)

    11.活动图activity diagram   活动图是描写叙述过程化逻辑procedural logic.业务过程business process和工作流work flow的技术. 他和流程图fl ...

  6. 卷积神经网络Lenet-5实现

    卷积神经网络Lenet-5实现 原文地址:http://blog.csdn.net/hjimce/article/details/47323463 作者:hjimce 卷积神经网络算法是n年前就有的算 ...

  7. 细说Oracle中NULL值

    1.NULL是什么? NULL表示UNKNOW(未知),其不代表不论什么值. 比如一行中某列没有不论什么值即为NULL. ORACLE同意不论什么一种数据类型的字段为空,除了下面两种情况: 1)主键字 ...

  8. 历届图灵奖 (Turing award)得奖名单

    历届图灵奖 (Turing award)得奖名单 一.总结 一句话总结:各个方面都有. 二.历届图灵奖 (Turing award)得奖名单 Turing奖最早设立于1966年,是美国计算机协会在计算 ...

  9. AndroidClipSquare安卓实现方形头像裁剪

    安卓实现方形头像裁剪 实现思路.界面可见区域为2层View 最顶层的View是显示层,主要绘制半透明边框区域和白色裁剪区域,代码比較easy. 第二层继承ImageView,使用ImageView的M ...

  10. 有奖试读&amp;征文--当青春遇上互联网,是否能点燃你的创业梦

    时至今日,互联网已经切入我们每一个人的工作.生活和学习的每一个角落.利用互联网这个工具,有人游戏,有人购物,有人上课,有人交友,而有那么一部分人去利用它完毕人生最完美的逆袭.相信每一个人心中都有个创业 ...