• 7-闭包、回调


    闭包

    闭包定义

    闭包就是能够读取其他函数内部变量的函数。
    由于在Javascript语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成"定义在一个函数内部的函数所以,在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁

    闭包示例

    function f1(){
        var n=999;
        function f2(){ //闭包
        alert(n);
        }
        return f2;
      }
      
    var result=f1();
    result();//999
    

    闭包的用途

    • 匿名自执行函数
    • 实现封装
    • 缓存
    • 闭包的另一个重要用途是实现面向对象中的对象,传统的对象语言都提供类的模板机制,这样不同的对象(类的实例)拥有独立的成员及状态,互不干涉。

    匿名自执行函数示例

    var datamodel = {  
        table : [],  
        tree : {}  
    };    
    (function(dm){  
        for(var i = 0; i < dm.table.rows; i++){  
           var row = dm.table.rows[i];  
           for(var j = 0; j < row.cells; i++){  
               drawCell(i, j);  
           }  
        }  
         
        //build dm.tree    
    })(datamodel); 
    
    /*
    我们创建了一个匿名的函数,并立即执行它,由于外部无法
    引用它内部的变量,因此在执行完后很快就会被释放,关键
    是这种机制不会污染全局对象。
    */
    
    

    封装代码示例

    var person = function(){  
        //变量作用域为函数内部,外部无法访问  
        var name = "default";     
        return {  
           getName : function(){  
               return name;  
           },  
           setName : function(newName){  
               name = newName;  
           }  
        }  
    }();   
    print(person.name); 
    print(person.getName());  
    person.setName("abruzzi");  
    print(person.getName());  
    /*
    在person之外的地方无法访问其内部的变量,而通过提供闭
    包的形式来访问。
    */
    

    缓存代码示例

    function f1(){
        var n=999;
        nAdd=function(){n+=1}
        function f2(){      
        alert(n);    
        }
        return f2;
      }
    var result=f1();
    result(); // 999
    nAdd();
    result(); // 1000
    
    

    实现面向对象中的对象代码示例

    function Person(){  
        var name = "default";     
        return {  
           getName : function(){  
               return name;  
           },  
           setName : function(newName){  
               name = newName;  
           }  
        }  
    };  
    var john = Person();  
    print(john.getName());  
    john.setName("john");  
    print(john.getName());  
    var jack = Person();  
    print(jack.getName());  
    jack.setName("jack");  
    print(jack.getName()); 
    
    /*
    闭包的另一个重要用途是实现面向对象中的对象,传统的对
    象语言都提供类的模板机制,这样不同的对象(类的实例)拥
    有独立的成员及状态,互不干涉
    */
    

    使用闭包的注意点

    1. 由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。
    2. 闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值。

    回调函数

    回调函数定义

    函数A作为参数(函数引用)传递到另一个函数B中,并且这个函数B执行函数A。我们就说函数A叫做回调函数。如果没有名称(函数表达式),就叫做匿名回调函数。
    回调函数是一个作为变量传递给另外一个函数的函数,它在主体函数执行完之后执行

    回调函数示例

    function a(callbackFunction){
        console.log("这是parent函数a");
        var m =1;
        var n=3;
        return callbackFunction(m,n);
      }
      
    function b(m,n){
        console.log("这是回调函数B");
        return m+n;
      }
      
    a(b)
    
    

    回调函数的作用

    1. 可以让实现方,根据回调方的多种形态进行不同的处理和操作。
    2. 可以让实现方,根据自己的需要定制回调方的不同形态。
    3. 可以将耗时的操作隐藏在回调方,不影响实现方其它信息的展示。
    4. 让代码的逻辑更加集中,更加易读。
  • 相关阅读:
    利用jQuery实现页面渐显效果
    struts2+hibernate4+spring3+maven搭建项目:简单账务管理系统(从头至尾,不断更新)
    struts2+hibernate4+spring3+maven搭建项目:简单账务管理系统第二篇:struts+spring搭建
    学习Qt ing...
    正则表达式大杂烩
    gradle 基础配置
    Cglib和jdk动态代理的区别
    WebFlux Controller层测试
    zipkin 配置翻译
    seata 踩坑记录
  • 原文地址:https://www.cnblogs.com/fengxuefei/p/6250532.html
Copyright © 2020-2023  润新知