javascript学习之路三------变量+作用域+内存问题

JavaScript的变量包含两种数据类型的值:基本类型值和引用类型值
基本类型值:Boolean、Null、Undefined、Number、String

在内存中占据固定大小的空间,保存在栈中

引用类型值:Object

保存在堆中

对于引用对象,JavaScript不允许直接访问内存中位置,也就是说不能直接操作对象的内存空间,操作的时候实际上是操作对象的引用,而不是直接操作对象,但也有例外,如果你给这个对象添加属性,其实也就是在操作对象。

也只有引用类型可以动态添加属性!!!

基本类型值的复制:

var num1=5;
var num2=num1;
num1和num2在内存上是完全独立的两个空间

引用类型值的复制:

var object1=new Object();
var object2=object1;
object1.name="mack";
alert(object2.name);

按照上面的写法,object1仅仅是这个对象的指针,object是内存里面这个对象的另一个指针,实际操作的都是同一个对象!!!所谓的指针也就是一个地址而已。

所有函数的参数都是按照值传递的,像对象这种引用类型值作为参数传递,也是值传递,函数作用域内,即使重写了该对象,函数结束后也立即销毁了!!!

typeof是用来检测数据是什么基本类型的,如果检测数据是不是对象(引用类型),可以用instanceof来检测!typeof检测正则表达式,返回的是"function",IE和Firefox浏览器,返回的是object.

作用域,作用域链,全局和局部就好比大环境和小环境,小环境发掘大环境里的资源是可以的,大环境无权探索小环境里的资源,就这么简单!!!

JavaScript是没有会计作用域的,如下:

if(true){
    var color="red";
}
alert(color);

执行下面这段话,color依旧是有值的!!!这就是为什么for循环的i值仍然是可以访问到的原因!!!

如果一个变量没有用var去声明的话,它就是全局变量,但是这种做法并不提倡,因为有的时候会报错。

搜寻标识符,其实是先从局部搜寻,搜寻不到在到全局搜,不管怎么样,反正是从里到外的搜,直到搜到为止,搜到了就不继续搜了,搜不到就报错了!

var color="blue";
function getColor(){
return color;
}
alert(getColor());

or

var color="blue";
function getColor(){
var color="red";
return color;
}
alert(getColor());

Javascript有自己的垃圾收集机制,就是说充分利用内存,和释放内存!!!

它的策略有两个:
标记清除:
就是变量使用的时候,给做一个进入环境的标记,不使用了,就打一个离开环境的标记,该内存就释放了。
引用计数(不用了):
这种情况是变量被赋予了引用类型值得时候才体现的,刚被赋予的时候引用次数+1,如果同一个值又被赋予了两一个变量,就在+1,如果后边引用的变量引用了其他的引用类型值了,那么一开始的引用次数就要-1了。当引用次数变为0的时候,就说明不需要了,该释放了!!!

引用计数的最大问题其实是循环引用问题,如果A对象和B对象,分别在各自的对象中引入了各自的指针,那么就无法做到引用次数为0,那么就永远都是占用内存,实在太不友好了。

function(){

var a=new object();
var b=new object();

a.getB()=b;
b.getA()=a;

}

手工清除避免内存泄露的方法就是

a.getA()=null;
b.getB()=null;

垃圾收集机制是周期性循环复始的,如果你想要立刻执行垃圾收集那么只需要一句话:

window.CollectGarbage();

解除引用:

function createPerson(name){
var LocalPerson=new Object();
localPerson.name=name;
return localPerson;
}
var globalPerson =createPerson("simalinjia");
//用完了以后要
globalPerson=null;

最后一句话的目的是让值脱离执行环境,以便垃圾收集器下次运行时将其回收!

本章结束

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值