zoukankan      html  css  js  c++  java
  • 闭包

    百度百科中对闭包的定义:

      闭包是可以包含自由(未绑定到特定对象)变量的代码块;这些变量不是在这个代码块内或者任何全局上下文中定义的,而是在定义代码块的环境中定义。“闭包” 一词来源于以下两者的结合:要执行的代码块(由于自由变量被包含在代码块中,这些自由变量以及它们引用的对象没有被释放)和为自由变量提供绑定的计算环境 (作用域)。在 Scala、Scheme、Common Lisp、Smalltalk、Groovy、JavaScript、Ruby 和 Python,objective c 等语言中都能找到对闭包不同程度的支持。

    占岭对闭包的定义:

       对于函数A,它内部有子函数B,A函数的返回值为函数B,当A函数的实例被建立之后,由于还存在着对函数B的引用,所以函数B中的值还会存在于内存中,这时函数B的这种浪费内存的行为我们称为闭包!

    在理解闭包之前,我们先来看一下JS变量的作用域吧:

    所为使用域就是一个对象或者变量的有效性的范围,下面的代码中详细的说明了这一点

    复制代码
    复制代码
         //变量的作用域
            function bobo() {
                var a = 1; //只在bobo函数体中有效
                b = 1; //声明了一个全局变量,在整个<script>块中有效
                function boboSub() {  //声明一个函数,它只在bobo函数中有效
                    var c = 1; //只有boboSub函数声中有效
                    c = c + a; //子函数中可以使用上级函数的变量
                }
            }
    复制代码
    复制代码

    通过一个代码来理解一下闭包吧:

    这个例子中有变量i,它是父函数a中的一个变量,它对子函数b是可见的,在函数b中对它进行累加操作,最后函数a将函数b返回,而由于函数a对函数b

    存在着地址上的引用,所以,当函数a没有被释放时,函数b也不会被释放,这虽然是不提供的,但在某种情况下是完成一些需求的最佳方式。即浪费的不一定是不好的。

    复制代码
    复制代码
       <script>
            function a() {
                var i = 0;
                function b() {
                    alert(++i);
                }
                return b;
            }
            var c = a();
            c();
        </script>
    复制代码
    复制代码

    它的结果不是0,而是1,这就是闭合的作用,事实上闭合将局部变量B提升了,默认情况下,我们先把直接访问到函数A的内部函数B,所以闭包还有一个提升变量级别的作用

  • 相关阅读:
    C#和SqlServer中处理时间格式问题
    ReadOnly之后获取文本框的值
    asp.net给Reaper和GridView添加序号
    SQL点滴31—SQL语句中@@IDENTITY和@@ROWCOUNT区别
    asp.net获取服务器信息
    Repeater嵌套
    开博说明 拓荒者
    Git的深入理解与GitHub托管服务的使用
    Hadoop学习笔记一:单节点安装
    VirtualBox克隆后无法找到网卡的问题
  • 原文地址:https://www.cnblogs.com/wdas-87895/p/6051304.html
Copyright © 2011-2022 走看看