zoukankan      html  css  js  c++  java
  • 闭包的7中形式

    返回值

      最常用的一种形式是函数作为返回值被返回

    复制代码
    var F = function(){
        var b = 'local';
        var N = function(){
            return b;
        }
        return N;
    }
    console.log(F()());
    复制代码

    函数赋值

      一种变形的形式是将内部函数赋值给一个外部变量

    复制代码
    var inner;
    var F = function(){
        var b = 'local';
        var N = function(){
            return b;
        };
        inner = N;
    };
    F();
    console.log(inner());
    复制代码

    函数参数

      闭包可以通过函数参数传递函数的形式来实现

    复制代码
    var Inner = function(fn){
        console.log(fn());
    }
    var F = function(){
        var b = 'local';
        var N = function(){
            return b;
        }
        Inner(N);
    }
    F();
    复制代码

    IIFE

      由前面的示例代码可知,函数F()都是在声明后立即被调用,因此可以使用IIFE来替代。但是,要注意的是,这里的Inner()只能使用函数声明语句的形式,而不能使用函数表达式。详细原因移步至此

    复制代码
    function Inner(fn){
        console.log(fn());
    }
    
    (function(){
        var b = 'local';
        var N = function(){
            return b;
        }
        Inner(N);
    })();
    复制代码

    循环赋值

      在闭包问题上,最常见的一个错误就是循环赋值的错误。关于其错误原因的详细解释移步至此

    复制代码
    function foo(){
        var arr = [];
        for(var i = 0; i < 2; i++){
            arr[i] = function(){
                return i;
            }
        }
        return arr;
    }
    var bar = foo();
    console.log(bar[0]());//2    
    复制代码

      正确的写法如下

    复制代码
    function foo(){
        var arr = [];
        for(var i = 0; i < 2; i++){
            arr[i] = (function fn(j){
                return function test(){
                    return j;
                }
            })(i);
        }
        return arr;
    }
    var bar = foo();
    console.log(bar[0]());//0    
    复制代码

    g(s)etter

      我们通过提供getter()和setter()函数来将要操作的变量保存在函数内部,防止其暴露在外部

    复制代码
    var getValue,setValue;
    (function(){
        var secret = 0;
        getValue = function(){
            return secret;
        }
        setValue = function(v){
            if(typeof v === 'number'){
                secret = v;
            }
        }
    })();
    console.log(getValue());//0
    setValue(1);
    console.log(getValue());//1
    复制代码

    迭代器

      我们经常使用闭包来实现一个累加器

    复制代码
    var add = (function(){
        var counter = 0;
        return function(){
            return ++counter; 
        }
    })();
    console.log(add())//1
    console.log(add())//2  
    复制代码

      类似地,使用闭包可以很方便的实现一个迭代器

    复制代码
    function setup(x){
        var i = 0;
        return function(){
            return x[i++];
        }
    }
    var next = setup(['a','b','c']);
    console.log(next());//'a'
    console.log(next());//'b'
    console.log(next());//'c'
     
  • 相关阅读:
    PAT 甲级 1126 Eulerian Path (25 分)
    PAT 甲级 1126 Eulerian Path (25 分)
    PAT 甲级 1125 Chain the Ropes (25 分)
    PAT 甲级 1125 Chain the Ropes (25 分)
    PAT 甲级 1124 Raffle for Weibo Followers (20 分)
    PAT 甲级 1124 Raffle for Weibo Followers (20 分)
    PAT 甲级 1131 Subway Map (30 分)
    PAT 甲级 1131 Subway Map (30 分)
    AcWing 906. 区间分组 区间贪心
    AcWing 907. 区间覆盖 区间贪心
  • 原文地址:https://www.cnblogs.com/zhangchuangye/p/6839451.html
Copyright © 2011-2022 走看看