诸多屌si不懂的javascript闭包

    xiaoxiao2025-04-22  8

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

    沿袭一向的简单粗暴风格,先来段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、闭包会在父函数外部,改变父函数内部变量的值。

    转载请注明原文地址: https://ju.6miu.com/read-1298341.html
    最新回复(0)