zoukankan      html  css  js  c++  java
  • 闭包的理解

    闭包:引用了自由变量的函数,这个被引用的变量和这个函数一同存在,即使已经离开创造他的环境。

    var a=function(){
            var test={};
            setInterval(function(){
                console.log(test);
            },1000)
        }

    test在a函数中被定义。a函数执行之后其中的变量和对象都会被销毁(垃圾回收机制)。但由于test被一直调用,所以不会被销毁。直到定时器停止。这个定时函数就是一个闭包。

    var obj=function(){
            var a='';
            var jju='hellow';
            return{
                set:function(val){
                    a=val;
                },
                get:function(){
                    return a;
                }
            };
            return jju;
        };
        var b =obj();
        b.set('new val');
        console.log(b.get());//new val;

    obj函数里面定义了a和返回了一个对象,这个对象有set和get方法。执行完var b=obj();之后obj中的内容会被销毁。但是返回的b还能调用这两个方法,所以a也就还存在。这里要注意的是函数执行完之后会销毁其中的上下文,但是闭包会把需要的变量(引用的那个变量)复制到闭包里面去,并不是保存整个过程的上下文。

    //好处,
    //1.可以使一个变量长期驻扎在内存当中。
    //2.避免全局变量的污染
    //利用函数表达式和匿名函数的立即调用将函数写成:

    var aaa=(function(){
    var a=1;
    return function(){
    a++;
    alert(a);
    }
    })();
    aaa();
    aaa();


    //我们通常把上面这段叫做模块化代码,避免全局变量的污染。
    //3.私有成员的存在。下面这段代码可以理解为模块化代码的模型,样子

    var aaa=(function(){
    var a=1;
    function bbb(){
    a++;
    alert(a);
    }
    function ccc(){
    a++;
    alert(a);
    }
    return {
    b:bbb;
    c:ccc;
    }
    })();
    console.log(aaa.b);
    console.log(aaa.c);
  • 相关阅读:
    python 小爬虫
    动态规划,网易秋招
    leetcode 3
    leetcode 27 水
    leetcode 21 list merge
    leetcode 15 3sum & leetcode 18 4sum
    leetcode 389 map iterator 的使用
    [转]使用flask实现mock server
    python __str__repr__ 区别
    Robot Framework 源码阅读 day2 TestSuitBuilder
  • 原文地址:https://www.cnblogs.com/jjucap/p/5532403.html
Copyright © 2011-2022 走看看