01、JS变量、作用域
2021-04-07 02:25
标签:ber 产生 全局 不能 延长 turn col 赋值 var 基本类型:Number、String、Boolean等。 引用类型:Object、Array等。 栈内存:一般保存 基本类型数据 和 引用类型数据的地址 堆内存:一般保存 引用类型数据。 注:栈内存可以直接按值可以访问;访问堆内存,先访问栈内存里面的地址。 基本类型比较:主要比较 值 跟 类型 引用类型比较:只要地址不一致,就是false 基本类型:a = b; //把b的 值 赋给a 引用类型:a=b; //把b的 地址 赋给a,只要地址里面的值发生变化,a和b都会发生变化 想要复制一份引用类型的数据(浅拷贝) 参数的传递都是按值传递的。无论基本数据类型还是引用数据类型。 instanceof:判断 左边对象 是否为 其右边类的实例 如: 全局作用域:定义在全局,作用在全局 局部作用域:如函数作用域,出了函数就访问不到 注意:js没有块级作用域。{ } 变量对象:如 作用域链:如 延长作用域链: 预解析 (变量和函数同名,保留函数;函数和函数同名,保留后面的;) 1、找出window对象,所有的var,并令其等于undefined 3、找出function对象,里面的var,并令其等于undefined 逐行解析 5、代码一行一行往下读,遇到function就跳过(遇到调用函数的语句,跳到该函数里面去) 如: //释放无用的数据,回收内存。js是自动收集的,object-c是手动收集的 自动收集:找出没用数据,打上标识,释放其内存,周期性执行。 标识无用数据的策略 标记清除:给所有的变量打上标记,去掉 环境中的变量,以及 被环境中引用的变量。 引用计数:跟踪每个值被引用的次数,当引用次数变成0时,就会被回收。 当声明了一个变量并将一个引用类型赋值给该变量时,则这个值的引用次数就是1。 var xm = { name=’123′,age=’14’ }; //这样xm就是1 如果包含对这个值引用的变量又取得了另外一个值,则这个值的引用次数就减1。 xm = {}; 或 xm = null; //这样就由原来的1再减1。1-1=0 注意:当循环引用时,a中带有b,b中带有a,引用计数就永远回收不到。(ie9以下的DOM采用的是引用计数策略,原生对象是标记清除策略,两种对象相互调用,可能产生循环计数) 因为 web浏览器 分配到的内存 小于桌面应用程序的内存,所以没用的变量要及时处理。(适用于多数全局变量;局部变量离开就会清除,所以局部用不到) 如: a = [… , … , … , …]; a = null; //当a数组用完了,之后不再需要时,就得手动清除内存 01、JS变量、作用域 标签:ber 产生 全局 不能 延长 turn col 赋值 var 原文地址:https://www.cnblogs.com/mingliangge/p/12490670.html数据类型
内存的堆栈
变量的比较
值的复制
function(obj){
newObj = {};
for(var p in obj){
newObj[p] = obj[p];
}
return newObj;
}
参数的传递
function setName(obj){
obj.name = ‘xm’;
obj = {};
obj.name = ‘xx’;
}
var pp = {};
setName(pp);
console.log(pp.name); //打印出xm
类型检测
var re = 123;
re instanceof Number; //true。判断re是否为number的实例
变量作用域
变量对象和作用域链
var sex = 18;
function a(){
var sex = 18;
}
//window对象sex、a === window.sex 、 window.a
//a函数对象sex === a.sex
var sex = 18;
var name = xm;
function a(){
var sex = 18;
console.log(sex); //优先局部里面的变量
console.log(name); //若局部里面没有,则会查找全局变量
} //注意:作用域链里面可以访问外面,但是外面不能访问里面
var person = {};
person.name = ‘xm’;
var score = 44;
with(person){ //用with,给person做延长或修改
sex = ‘male’; //给person对象添加person.sex
name = ‘bb’; //修改person.name
score = 0; //person.score找不到,但在全局找到score,所以修改
} //尽量少用或者不用with
JS解析机制
2、找出window对象,所有的function,并令其等于函数本身
4、找出function对象,里面的function,并令其等于函数本身(若没有嵌套函数就跳过)var name = ‘bb’;
function rr(){
console.log(name); //这里的name不会跳到window对象外面,因为预解析时,函数里面已经有一个name,并且已经赋值为undefined
var name = ‘yy’;
}
console.log(name); //没有var的全局变量,预解析不到。所以会报错
name = ‘bb’;
垃圾收集机制
内存管理
上一篇:HTML 基础 元素 标签
下一篇:02、JS函数深入讲解