延长作用域链
另外关于延长作用域链问题:以下的两种情况会使作用域链延长
- try-catch语句的catch块;
- with语句;
这个两个语句都会再原本的作用域链的前端添加一个变量对象。对于with语句来说,新添加的变量对象包含着with括号中指定对象的所有属性和方法所作的变量声明。对于catch来说,当try块发生错误时,代码执行流程自动转入到catch块,并将异常对象推入到作用域链的前端。catch块执行完毕后,作用域链就会返回原来的状态。
当代码运行到with语句时,运行期上下文的作用域链临时被改变了。一个新的可变对象被创建,它包含了参数指定的对象的所有属性。这个对象将被推入作用域链的头部,这意味着函数的所有局部变量现在处于第二个作用域链对象中,因此访问代价更高了。如下图所示:
垃圾回收_JavaScript垃圾回收机制
一、JS 垃圾回收机制
1》标记清除
最常用的一种垃圾回收机制
2》引用计数
最不常用一种垃圾回收机制
3》手动清除
把不用的变量或者对象或者函数===》(赋值为)= null
JS具有自动垃圾清理的机制,也就是说,执行环境会负责管理代码执行过程中的内存。这种垃圾收集的机制的原理其实很简单:找出那些不再使用的变量,然后释放掉它们占用的内存。为此,垃圾收集器会周期性的执行这个操作。
1、标记清除
JS最常用的垃圾收集方式就是标记清除。当一个变量进入环境时,就将变量标记为“进入环境”。当变量离开环境时,则标记为“离开”。
垃圾收集器在运行的过程中会给所有内存中的变量都加上标记,然后,它会去掉环境中的变量以及被环境中的变量引用的变量的标记。而在此之后,再被加上标记的变量将被视为准备删除的变量,因为环境中的变量已经无法访问到这些变量了。最后,垃圾处理器完成内存清理工作,销毁那些带标记的值,并回收它们的存储空间。
2、引用计数
引用计数是一种不太常见的垃圾收集策略。引用计数的策略是跟踪记录每个值被引用的次数。当某个变量的引用计数为0时,表示该变量已经无法被访问了,则改变量可以被回收。
3、管理内存
使用具备垃圾收集机制的语言编写程序,开发人员一般不用操心内存管理的问题。但是,确保使用最少的内存可以让页面获得更好的性能。优化内存占用的最好方式,就是为执行中的代码只保存最少的数据。一旦数据不再使用,最好通过将其设置为null来释放其引用。局部变量会在它们离开执行环境后自动被解除引用。
function createPerson(name){
var localPerson = new Object();
localPerson.name = name;
return localPerson;
}
var globalPerson = createPerson("Nicholas");
// 解除globalPerson的引用
globalPerson = null;