js栈内存和堆内存
内存分配与垃圾回收:
在编译阶段,除了声明变量和函数,查找环境中的标识符这两项工作之外,还会进行内存分配。不同类型的数据会分配到不同的内存空间
一般来说栈内存线性有序存储,容量小,系统分配效率高。而堆内存首先要在堆内存新分配存储区域,之后又要把指针存储到栈内存中,效率相对就要低一些了。
垃圾回收方面,栈内存变量基本上用完就回收了,而堆内存中的变量因为存在很多不确定的引用,只有当所有调用的变量全部销毁之后才能回收。
- 栈内存:引擎执行代码时工作的内存空间,除了引擎,也用来保存基本值和引用类型值的地址。
- 堆内存:用来保存一组无序且唯一的引用类型值,可以使用栈中的键名来取得。
解析: 引擎不能直接操作堆内存中的数据,这就造成了对同一个变量赋不同类型的值,会出现完全不同的效果:为一个变量赋基本值时,实际上是创建一个新值,然后把该值赋给新变量,可以说这是一种真正意义上的"赋值";
为一个变量赋引用值时,实际上是为新变量添加一个指针,指向堆内存中的一个对象,属于一种” 赋址 "操作。
——赋值与赋址
总的区别:
用JavaScript实现静态私有变量,静态私有方法,私有变量,私有方法,公有属性,公有办法
导语:
JavaScript作为一门面对对象的编程语言,但是它没有private,public,和static,那是否它就没办法实现面对对象编程的一些属性呢?不是的,只需要使用JavaScript的一些特性,照样可以写出这些东西出来。
直接看代码,使用闭包实现。
var food = (function() {
var foodnum = 0; //静态私有属性
function checkfood(name) {} //静态私有方法
//创建类
function _food(newid, newname ,newprice) {
var name, price //私有变量
function checkfood() {} //私有方法
this.getname = function() {}
this.getprice = function() {}
this.setname = function() {}
this.setprice = function() {}
this.id = newid //公有属性
this.name = newname
this.price = newprice
this.copy = function() {} //公有方法
foodnum++
this.setname(name) //构造器
this.setprice(price) //构造器
}
_food.prototype = {
isgoodfood = false, //静态公有属性
display = function() {} //静态公有方法
}
return _food //返回类
})()