诸多屌si不懂的javascript闭包

来源:互联网 发布:linux解压缩命令 编辑:程序博客网 时间:2024/06/04 00:23

小知识点共勉一下,以便打发无聊的下雨天。。。。


沿袭一向的简单粗暴风格,先来段javascript代码:

       function parent()

      {

   var i=100;

            function child()

   {

        alert("读取父函数局部变量i="+i);//获取成功,值为100

   }

      }

      事实说明,子函数能向上读取其父函数的局部变量。然这并不奇怪,因为Javascript语言具有的"链式作用域"结构(chain scope),子对象会自动向上寻找所有父对象的变量,父对象的所有变量对子对象是可见的,但反过来则不成立!!那如何通过其他手段实现呢?

这就是本文的重点:闭包

--概念

      关于变量的作用域,分为全局变量和局部变量两种

      关于什么是闭包,网上的说法很多,个人认为较准确的一种:“Javascript允许使用内部函数(函数定义和函数表达式位于另一个函数的函数体内),这些内部函数可以访问它们所在的外部函数中声明的所有局部变量、参数和声明的其他内部函数。当这样的内部函数在包含它们的外部函数之外被调用时,就会形成闭包。”简单来讲就是以下两点:

 1、内部函数有访问外部函数的局部变量x

 2、内部函数在外部函数之外被调用读取x

      --代码诠释

       外部函数之外无法直接访问外部函数的局部变量x,利用闭包则能够做到。

<script type="text/javascript">

       function parent() 

      {

//一定要使用var命令,否则声明了的是一个全局变量!

            var x= 100;

            function child()

            {

         return x; //返回父函数的局部变量

            }

           return child;

      }

      //如果我们直接读取x是做不到的

      alert("读取不到x:"+x);


   //这样我们就能直接读取x

      var childFun = parent();

      //调用子函数

      var y=childFun();

      alert("读取到x:"+y); //读取到x:100

</script>

--使用闭包注意

1、由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。

2、闭包会在父函数外部,改变父函数内部变量的值。




0 0
原创粉丝点击