• 闭包


    1、什么是闭包?

     

     

    2、闭包的优点?应用在哪里?

     

    3、使用闭包需要注意什么?

     

     

    1.什么是闭包?

     

     

    简单的说,就是函数嵌套函数,

     

    内部函数可以引用外部函数的参数和变量

     

     

    参数和变量不会被垃圾回收机制所回收

     

    Eg: 

     

     

    function aaa( ){

     

    var a=5;

     

     

    function bbb( ){

     

    console.log( a );

     

     

    }

     

    return bbb;

     

     

    }

     

    var c=aaa();

     

     

    c();//5

     

     

     

    2、闭包的优点?

     

    (1)希望或者说可以使一个变量长期驻扎在内存当中

     

     

    (2)避免全局污染

     

    首页看一个全局变量的例子:

     

     

    eg:

     

    var a=1;

     

     

     function aaa(){

     

    a++;

     

     

    console.log(a);

     

    }

     

     

    aaa();//2

     

    aaa();//3

     

     

    然后把这个变量变成局部变量来看一下:

     

    function aaa(){

     

     

     var a=1;

     

    a++;

     

     

    console.log(a);

     

    }

     

     

    aaa();//2

     

    aaa();//2

     

     

    接下来咱们改成闭包:

     

     

    function aaa() {

     

    var a=1;

     

     

    return function(){

     

    a++;

     

     

    console.log( a );

     

    }

     

     

    }

     

    var b=aaa();

     

     

    b();//2

     

    b();//3

     

     

    还可以这样写:

     

    var aaa=( function( ) {

     

     

    var a=1;

     

     return function(){

     

     

    a++;

     

    console.log(a);

     

     

    }

     

    } ) ( );

     

     

    aaa();//2

     

    aaa();//3

     

     

    那闭包用在哪里呢?看下面例子

     

     

    (1)模块化代码

     

    var aaa=( function(){

     

     

    var a=1;

     

    function bbb() {

     

     

    a++;

     

    console.log( a );

     

     

    }

     

    function ccc() {

     

     

    a++;

     

    console.log( a );

     

     

     }

     

    return {

     

     

    b:bbb,

     

    c:ccc

     

     

    }

     

    } )( );

     

     

    aaa.b();//2

     

    aaa.c();//3

     

     

    aaa.ccc();//报错

     

     

    继续往下看:

     

     

    (2)在循环中直接找到对应元素的索引

     

    eg: <ul>

     

     

    <li>11</li>

     

    <li>11</li>

     

     

    <li>11</li>

     

    </ul>

     

     

    window.onload=function() {

     

    var aLi=document.getElementsByTagName( li );

     

     

    for( var i=0; i< aLi.length; i++){

     

    aLi [ i ].onclick=function(){

     

     

    alert(i);//连续弹出三次3

     

    }

     

     

    }

     

    }

     

     

     

    上面没有达到闭包效果,那么怎么改写呢?看下面

     

     

     

     

    window.onload=function() {

     

    var aLi=document.getElementsByTagName( ‘li’ );

     

     

    for( var i=0; i< aLi.length; i++){

     

    ( function( i){

     

     

    aLi [ i ].onclick=function( ){

     

    alert(i);//连续弹出三次,分别0 1 2

     

     

    }

     

    } )( i );

     

     

    }

     

    }

     

     

    还可以这样改写:

     

    window.onload=function() {

     

     

    var aLi=document.getElementsByTagName( ‘li’ );

     

    for( var i=0; i< aLi.length; i++){

     

     

    aLi [ i ].onclick=(function( i ){

     

    return function(){

     

     

    alert(i);//连续弹出三次,分别0 1 2

     

    }

     

     

    })( i );

     

     

     

    }

     

    3、闭包注意的地方?继续往下看

     

     

    在IE浏览器会出现或引起内存泄露,如何解决?

     

    eg:

     

     

    <div id=” d1”> 555</div>

     

    window.onload=function () {

     

     

    var oDiv=document.getElementById(‘d1’);

     

    oDiv.onclick=function(){ //变量引用内部函数

     

     

    alert(oDiv.id); //内部函数引用外部对象

     

    }

     

     

    //这时候就会出现内存泄露,应该这样解决

     

    window.onunload=function(){

     

     

    oDiv.omclick=null;

     

    }

     

     

    }

     

    还可以这样解决:

     

     

    window.onload=function () {

     

    var oDiv=document.getElementById(‘d1’);

     

     

    var id=oDiv.id;

     

    oDiv.onclick=function(){ 

     

     

    alert(id); 

     

    }

     

     

    oDiv=null;

     

    }

     

     

    }

  • 相关阅读:
    FFmpeg4.0 的filter机制的架构与实现.之二 结构体关系与定义
    ffmpeg filter过滤器 基础实例及全面解析
    Filter初始化 filter
    FFmpeg4.0 的filter机制的架构与实现.之三 Filter实现的源码分析
    C语言结构体初始化的四种方法
    ChilliCream 是一个开源免费的 GraphQL 平台
    十道算法题
    速战速决 Python python 基础: 函数
    速战速决 Python python 数据类型: 集合类型
    速战速决 Python python 高级: 迭代器,生成器
  • 原文地址:https://www.cnblogs.com/ckf1988/p/5620919.html
Copyright © 2020-2023  润新知