4.1.4 检测类型
检测引用类型的值是什么对象,使用instanceof
4.2 执行环境及作用域
执行环境是js中最为重要的一个概念。每个环境都有一个与之关联的变量对象,环境中定义的所有变量和函数都保存在该变量对象中。
web中,window对象被认为是全局执行环境。某个执行环境中的所有代码执行完毕后,该环境被销毁,保存在其中的所有变量和函数定义也随之销毁。
每个函数有自己的执行环境,每进入一个函数,函数的执行环境就会被推入一个环境栈中。
每进入一个环境,会创建变量对象的一个作用域链。其用途是,保证对执行环境有权访问的所有变量和函数的有序访问。
4.2.1 延长作用域链
有些语句可以在作用域链前端临时增加变量对象,该变量对象会在代码执行后被移除。
1、try-catch语句的catch块
2、with语句。也许是因为会延长作用域链,导致性能下降,不推荐使用吧。
function buildUrl(){
var qs = "?debug=true";
with(location){ //其变量对象中就包含了location对象的所有属性和方法
var url=href+qs; //url变量仍在buildUrl()环境的变量对象中
}
return url; //因此能返回,没有报错
}
4.2.2 没有块级作用域(ES6中let提供块级作用域功能)
if(true){
var color = "blue";
}
alert(color); //blue
for(var i=0;i<10;i++){
doSomething(i);
}
alert(i); //10
4.3 垃圾收集
js具有自动垃圾收集机制
采用标记清除算法,因为引用计算算法在循环引用中存在严重问题导致内存泄露。
全局变量不再使用的时候,需要手工解除引用,让值脱离执行环境,以便垃圾收集器下次运行将其回收。
globalPerson = null;