变量的作用域?
变量
作用:起作用
域:区域,范围
变量起作用的地方
- 变量的生命周期,变量生于这个作用域,死于这个作用域
- 访问到变量
作用域的分类
- 全局作用域
- 局部作用域:函数作用域(函数作用域)
没有块级作用域
var name='xm'; //全局变量 全局作用域
function fn(argument){
var sex='male'; //局部变量 局部作用域
}
console.log(sex);
全局作用域的变量相当于window的一个属性。
var name='xm'; //全局变量 全局作用域
function fn(argument){
var sex='male'; //局部变量 局部作用域
}
console.log(window.name===name); //true
console.log(window.sex===sex); //抛出引用错误
作用域链
var name='xm';
fucntion fn(){
var name='xh';
var sex='male';
function fn2(){
var name='xhei';
var age=18;
}
}
延长作用域链
var person={};
person.name='xm';
person.sex='male';
var score=4;
console.log(person.name); //xm
console.log(person.sex); //male
console.log(score); //4
//延长作用域链
with(person){
name='xh';
sex='female';
scroe=44;
}
console.log(person.name); //xh
console.log(person.sex); //female
console.log(score); //44
缺点:影响查询速度
优点:少写person.
总结:很鸡肋,不推荐使用
两道题
说明:不存在的变量或函数会报错;不存在的属性或方法,返回undefined。
||是短路操作,形如a||b,如果a的值转换成布尔值是true的话,a||b等于a;如果a的值转换成布尔值是false的话,a||b等于b。
所以document.write(person || (person = 'xm'))是会报错,提示person is not defined;
document.write(window.person || (window.person = 'xm'));这条语句||后面的条件是true,所以返回xm。
说明·:,因为for循环的时候并没有执行里面的 function,所以它只绑定了点击事件后就会继续循环,直到循环结束,储存的是结束时的值;当我们点击按钮时,for 以执行完,所以每次弹出的都是最后的i值 3。
循环时只绑定了点击事件直到循环结束,当我们点击按钮时才会执行函数中的语句,点击事件实在循环结束后才会执行。
垃圾收集机制
释放无用的数据,回收内存
- 自动:js
- 手动:Objective-V
原理:找到没用的数据,打上标记,释放内存,周期性执行
标识无用数据的策略 - 标记清除
目前主流的垃圾收集算法
就是不用的值加标记,然后回收其内存 - 引用计数
引用计数算法可能是因为循环引用的问题得不到释放
当变量不用的时候,可以手动解除他的引用
var xm{
name:'xm';
age=18;
}; //xm引用这些值,所以引用1
var xh='xm'; // xh复制xm的地址,也引用了这些值,引用2
xh={} //原始数据值只剩下xm去引用,引用1
xm=() //原始数据值都没有变量引用,引用0 可以回收
}
循环引用
function fn(argument){
var xm={};//1
var xh={}; //1
fn();
xm=null; //0
xh=null; //0
}
function fn(argument){
var xm={}; //1
var xh={}; //1
xm.wifi=xh;//2
xh.husband=xm; //2
}
fn();
xm=null; //1
xh=null; //1
xm,xh永远不会回收
早期浏览器IE6,7,8 DOM,BOM存在循环引用
var obj={}; //引用0
var elem=document.getElementById("box");//DOM 引用0
elem.someAttr=obj; //引用1
obj.someProperty=elem; //引用1
elem.somAttr=null; //手动减少引用,引用0
obj.someProperty=null;// 引用0
内存管理
- Web浏览器的内存 < 桌面应用程序内存
- 释放内存的方式 :变量赋值为null ,解除引用,适合大多全局变量。局部变量离开作用域自动解除引用。
var arr=[...]; //数组大 耗资源
...
...
arr=null;
...