以下内容来自读网上博客的总结,当笔记使用,只记重点,同时非常感谢乐于分享的博主们,是你们让我站在了巨人的肩旁上!
1、(以下解释完全不对,请不要当真)
var temp = (function(){
var name ="test";
return function(){
alert(name);
}
})();
以上代码片断是我们jser经常见到的写法,是传说中的闭包。 众所周知:调用 temp();会弹出 “ test”;该过程可以有以下三条理论作为依据来解释:
1)js 作用域只和函数的界定符相关,函数与函数的嵌套形成了作用域链;
2)作用域链的创建规则是复制上一层环境的作用域链,并将指向本环境变量对象的指针放到链首;
3)在Javascript中,如果一个对象不再被引用,那么这个对象就会被GC回收。如果两个对象互相引用,而不再被第3者所引用,那么这两个互相引用的对象也会被回收。
如果看了以上3条还不明白,可看接下来结合理论对代码的详细解释:
首先外层函数执行完,被销毁;但是外层函数的作用域链被复制到内层函数的作用域链里,组成内层函数的作用域链的一部分,记住是复制,不是引用(依据第2条),所以内层函数仍然可以访问到 name;由于 返回的内层函数被 temp 引用,所以当外层函数执行完被销毁后,内层函数虽然作为外层函数的一部分,但是依然存在,正如第3条依据那样,它被第三者引用了;传说中的闭包也就是这个理;
2、
with是将当前对象添加到当前作用域链的头部,with语句结束后,作用域链取消刚才增加的对象,恢复正常。
讲解作用域链讲的超好的一篇E文,看完想不会都不行:http://dmitrysoshnikov.com/ecmascript/javascript-the-core/