您的位置:首页 > Web前端 > JavaScript

js笔记--js数据类型与内存分配(杂记)

2016-10-27 18:25 337 查看
ECMAScript变量可能包含两种不同数据类型的值:基本类型值和引用类型值。
基本类型值指的是那些保存在栈内存中的简单数据段,即这种值完全保存在内存中的一个位置。
而引用类型值是指那些保存堆内存中的对象,意思是变量中保存的实际上只是一个指针,这个指针指向内存中的另一个位置,该位置保存对象。

5种基本数据类型:Undefined、Null、Boolean、 Number和String。这5种基本数据类型的值在内存中分别占有固定大小的空间,因此可以把它们的值保存在栈内存。

如果赋给变量的是一个引用类型的值,则必须在堆内存中为这个值分配空间。由于这种值的大小不固定,因此不能把它们保存到栈内存中。但内存地址的大小是固定的,因此可以将内存地址保存在栈内存中。这样,当查询引用类型的变量时,就可以首先从栈中读取内存地址,然后再“顺藤摸瓜”地找到保存在堆中的值。

保存在栈内存中的每个值,分别占据着固定大小的空间,可以按照顺序来访问它们。如果栈内存中保存的是一块内存的地址,则这个值就像是一个指向对象在堆内存中位置的指针。保存在堆内存中的数据不是按顺序访问的,因为每个对象所需要的空间并不相等。
====================================分割一下=========================================
GC对闭包中的变量回收
1、首先闭包是一个函数,其能访问其他函数作用域中的变量
2、闭包最大用处有两个,一个是可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中
3、函数内部未被外部引用的变量,随着函数生命周期的完结而被销毁(调用之时,重新为变量分配内存,调用完即销毁,收回内存,下次继续调用的时候,重复上述周期操作),因此,受闭包影响而被调用的受闭包牵连的外部执行环境中的具名函数,其内部未进一步受牵连的变量回收不需要担心。
4、主要的是受闭包影响而被保持征用状态的受闭包牵连的外部执行环境中的变量,因存在调用该闭包函数的可能而被一直保存在内存中不被释放,因此,将该变量释放的唯一途径就是切断闭包函数被调用的可能,见例子:


var _zi = (function () {
var laozi = "hehe";

function _tai() {
var inner = -1;//inner变量无外部更深层次的调用,因此会随着_tai函数的调用而被不断创建和销毁
laozi = Math.ceil(Math.random() * 10);
console.log("fuck laozi:" + laozi);
}

return {
"fun_1": function () {
console.log(laozi);
},
"fun_2": _tai,
"delete": function () {
laozi = null;
}
}
})();
_zi.fun_2();//变量laozi因闭包函数_zi.fun_2可能被被调用,未被销毁而会一直存在
_zi.fun_2();//变量laozi因闭包函数_zi.fun_2可能被被调用,未被销毁而会一直存在
_zi.fun_1();//变量laozi因闭包函数_zi.fun_1可能被被调用,未被销毁而会一直存在
_zi.delete();//即使将变量laozi置为null,但仍存在被调用的可能,其作为js基本数据类型,仍然会在栈内存中暂用一定空间
_zi.fun_1();//null,依然霸占着栈内存的一个位置
_zi.fun_2();//变量laozi又被重新赋值,依然霸占着栈内存的一个位置
_zi = null;//将_zi赋值为null,此举切断闭包函数被调用的可能,此时变量laozi 才真正意义上被释放,被GC回收,匿名自执行函数内的所有变量都将被回收
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息