js-作用域及作用域链

以下内容来自读网上博客的总结,当笔记使用,只记重点,同时非常感谢乐于分享的博主们,是你们让我站在了巨人的肩旁上!

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/



评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值