js数据运行的机制
js执行,浏览器首先会形成一个全局作用域,代码自上而下执行
运行基本数据类型的值和引用数据类型的值,操作有本质的不同
基本数据类型:number,boolean,string,undefined,null
引用数据类型:object,function,array,Date,Math,Errer....
- 基本数据类型操作的是>值
1,声明一个变量,默认值是undefined
2,在这个作用域中分配一个位置给值
3,把这个值赋值给变量
var a=12;
var b=a;
b=13;
console.log(a,b);
- 引用数据类型操作的是内存空间
1,在这个作用域中开辟一个内存空间,并给这个内存分配一个16进制的地址名
2,把引用数据值存储到这个内存中(对象和数组是以键值对的形式存储,函数式是以代码字符串的形式存储)
3,最后把16进制的地址名给对象(普通对象,数组,函数)
以后要操作这个变量,通过地址名找到对应的内存空间
var ary=[12,23];
var ary2=ary;
ary2[0]=100;
console.log(ary,ary2);//100,23
-函数的创建和执行
创建和对象数组一样,只不过存的是字符串
执行:
1,函数执行首先会形成一个私有的作用域
2,形参赋值和变量提升
3,通过内存地址找到对应的内存空间,把代码字符串变成真正的js代码
4,代码自上而下执行
5,代码执行完成,是否有返回(return)
function sum(){
var total=0;
for(var i=0; i<arguments.length;i++){
var item=arguments[i];
if(!isNaN(item)){//is not a number,true=>不是数字,false=>是数字
total+=item;
}
}
return total;
}
var s= sum(10,20,30,40,'aa','bb');
console.log(s);
1,拿到所有的数字
2,把所有的数字相加
全局作用域和私有作用域执行,遇到基本数据类型的值,在当前作用域中分配一个位置存储这个值,
遇到引用数据类型的值,会在当前作用域中开辟一个内存空间存储它的值
二,堆栈,堆栈的作用,堆栈的销毁
- 栈内存:不管是全局作用域还是私有作用域都叫着执行栈,栈内存
作用:1,提供js运行的环境,2,保存基本数据类型的值
- 堆内存:存储引用数据类型的内存空间,叫着堆内存
作用:1,保存引用数据类型的值
- 堆栈内存的销毁:
栈内存的销毁:1,全局作用域销毁-->关闭浏览器
2,私有作用域销毁-->看是否被外面的变量占用
堆内存的销毁:内存空间不被外面的变量占用,浏览器空闲的时候销毁这个内存空间
- 浏览器的内存回收机制:
webkit内核的浏览器:每隔一段事件,都会循环查找是否有被占用的内存空间,
没有,就在浏览器空闲的时候,自主的销毁内存
ie浏览器:内存计数器:当内存被占用的时候,会在这个内存上加一个计数器,
每占用一次+1,减少一次占用就-1,是0的时候,被销毁
- 如何销毁:
1,全局作用域销毁-->关闭浏览器
2,私有作用域,堆内存不被占用-->把占用内存空间的变量赋值为null