zoukankan      html  css  js  c++  java
  • 闭包的使用实例

    场景一:采用函数引用方式的setTimeout调用

    闭包的一个通常的用法是为一个在某一函数执行前先执行的函数提供参数。例如,在web环境中,一个函数作为setTimeout函数调用的第一个参数,是一种很常见的应用。

    setTimeout将要执行的函数(或者一段javascript代码,但这不是我们要讨论的情况)作为它的第一个参数,下一个参数是需要延迟执行的时间。如果一段代码想通过setTimeout来调用,那么它需要传递一个函数对象的引用来作为第一个参数。延迟的毫秒数作为第二个参数,但这个函数对象的引用无法为将要被延迟执行的对象提供参数。

    但是,可以调用另一个函数来返回一个内部函数的调用,将那个内部函数对象的引用传递给setTimeout函数。内部函数执行时需要的参数,在调用外部函数时传递给它。setTimeout在执行内部函数时无需传递参数,因为内部函数仍然能够访问外部函数调用时提供的参数:

     
    function callLater(paramA, paramB, paramC) {  
                /*使用函数表达式创建并放回一个匿名内部函数的引用*/  
                return (function () {  
                    /* 
                    这个内部函数将被setTimeout函数执行; 
                    并且当它被执行时, 
                    它能够访问并操作外部函数传递过来的参数 
                    */  
                    paramA[paramB] = paramC;  
                });  
            }  
      
            /* 
            调用这个函数将在它的执行上下文中创建,并最终返回内部函数对象的引用 
            传递过来的参数,内部函数在最终被执行时,将使用外部函数的参数 
            返回的引用被赋予了一个变量 
            */  
            var funcRef = callLater(elStyle, "display", "none");  
            /*调用setTimeout函数,传递内部函数的引用作为第一个参数*/  
            hideMenu = setTimeout(funcRef, 500);  

    场景一.1:

    var foo = ( function() {
        var secret = 'secret';
        // “闭包”内的函数可以访问 secret 变量,而 secret 变量对于外部却是隐藏的
        return {
            get_secret: function () {
                // 通过定义的接口来访问 secret
                return secret;
            },
            new_secret: function ( new_secret ) {
                // 通过定义的接口来修改 secret
                secret = new_secret;
            }
        };
    } () );
    
    foo.get_secret (); // 得到 'secret'
    foo.secret; // Type error,访问不能
    foo.new_secret ('a new secret'); // 通过函数接口,我们访问并修改了 secret 变量
    foo.get_secret (); // 得到 'a new secret'

    原网址链接:http://blog.csdn.net/yanghua_kobe/article/details/6780181

  • 相关阅读:
    外设驱动库开发笔记5:AD7705系列ADC驱动
    ROS+LEDE最强上网软路由
    Flume1.9.0的安装、部署、简单应用(含分布式、与Hadoop3.1.2、Hbase1.4.9的案例)
    通过 Sqoop1.4.7 将 Mysql5.7、Hive2.3.4、Hbase1.4.9 之间的数据导入导出
    Hadoop 3.1.2(HA)+Zookeeper3.4.13+Hbase1.4.9(HA)+Hive2.3.4+Spark2.4.0(HA)高可用集群搭建
    Centos7 二进制安装 Kubernetes 1.13
    Centos7 使用 kubeadm 安装Kubernetes 1.13.3
    go get获取gitlab私有仓库的代码
    Nginx设置Https反向代理,指向Docker Gitlab11.3.9 Https服务
    Docker 创建 Bamboo6.7.1 以及与 Crowd3.3.2 实现 SSO 单点登录
  • 原文地址:https://www.cnblogs.com/waisonlong/p/4662051.html
Copyright © 2011-2022 走看看