zoukankan      html  css  js  c++  java
  • 函数&闭包

    1. 作用域链

    闭包的理解

    所谓“闭包”,指的是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。

    下面来看一个例子:

    function a(){  
        var tmp=1;  
        return function a_sub(x){  
           alert(x+(tmp++));  
        }  
    }  
      
    var b = a;      //此处a和b是一模一样的,b是从a拷贝了一份过去  
    var c1 = a();   //此处a加上了括号,于是c1的函数其实就是 a中return回来的函数(此函数可以调用a外面的变量tmp)  
    var c2 = b();   //为了证明a和b是同样的功能,且是复制了一份  
    c1(3);    //输出4  
    c1(3);    //输出5,——说明a并内存并未释放  
      
    c2(3);    //输出4——说明a和b是复制关系(两个独立的对象),内存中互相独立  
    

    这段代码有几个注意点:

      1、函数a_sub嵌套在函数a内部;

      2、函数a返回函数a_sub。

      3、a和b是同样的函数功能

      4、obj=a和obj=a()是不一样的

      这样在执行完c1c2后,变量c实际上是指向了函数a的内嵌函数a_sub,再执行c1()后就会弹出一个窗口显示i的值。这段代码其实就创建了一个闭包,为什么?因为函数a外的变量c引用了函数a内的函数a_sub,就是说:

      当函数a的内部函数a_sub被函数a外的一个变量引用的时候(如c1c2,而不是b),就创建了一个闭包。

    闭包的用途:
      相同函数可以用多个相互独立的对象引用,避免代码冗余、相互污染。闭包函数实际是做的全局变量的功能,在大型项目中,不适用闭包函数的话,相同功能的函数,我们就需要多次创建新的函数,否则同时调用一个函数,不仅会造成后面的函数不能正常使用,如果改动了全局变量,还会对前面正常的函数产生影响、造成污染。因此我们需要用到闭包。而且可以使代码简单化,体积小。

    参考:http://blog.csdn.net/yummy_go/article/details/50663081

  • 相关阅读:
    移动端疫情展示
    第五周学习进度
    第四周学习进度
    结队开发-四则运算
    第三周学习进度
    全球疫情可视化第一阶段
    第二周学习进度
    面试题 02.07. 链表相交 做题小结
    剑指 Offer 35. 复杂链表的复制 做题小结
    LeetCode 452. 用最少数量的箭引爆气球 做题小结
  • 原文地址:https://www.cnblogs.com/feiyu6/p/7243995.html
Copyright © 2011-2022 走看看