zoukankan      html  css  js  c++  java
  • JavaScript 闭包

    先看一段代码:
    function a()
    {
        var i=0;
        function b()
        {
            alert(++i);
        }
        return b;
    }
    
    var c=a();
    // 显示1
    c();
    
    // 显示2
    c();
    
    //显示3
    c();
    
    var d=a();
    // 显示1
    d();
    // 显示2
    d();

    当函数a的内部函数b被函数a外的一个变量引用的时候,就创建了一个我们通常所谓的“闭包”。 闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。

    闭包的作用就是在a执行完并返回后,闭包使得Javascript的垃圾回收机制GC不会收回a所占用的资源,因为a的内部函数b的执行需要依赖a中的变量。

    那么我们来想象另一种情况,如果a返回的不是函数b,情况就完全不同了。因为a执行完后,b没有被返回给a的外界,只是被a所引用,而此时a也只会被b引用,因此函数a和b互相引用但又不被外界打扰(被外界引用),函数a和b就会被GC回收。

    闭包的应用场景

    1. 保护函数内的变量安全。以最开始的例子为例,函数a中i只有函数b才能访问,而无法通过其他途径访问到,因此保护了i的安全性。
    2. 在内存中维持一个变量。依然如前例,由于闭包,函数a中i的一直存在于内存中,因此每次执行c(),都会给i自加1。
    3. 通过保护变量的安全实现JS私有属性和私有方法(不能被外部访问)

    这里有一个链接讲的比较全

    http://www.cn-cuckoo.com/2007/08/01/understand-javascript-closures-72.html

  • 相关阅读:
    【CodeForces 611C】New Year and Domino
    【HDU 1003】 Max Sum
    【ZOJ 3502】Contest
    【LightOJ 1422】Halloween Costumes(区间DP)
    【ZOJ 3609】Modular Inverse
    乘法逆元及其应用
    除法和取余的运算时间
    HUD3689 Infinite monkey theorem
    POJ2185 Milking Grid
    1355: [Baltic2009]Radio Transmission[循环节]
  • 原文地址:https://www.cnblogs.com/cnblogsfans/p/1586957.html
Copyright © 2011-2022 走看看