zoukankan      html  css  js  c++  java
  • javascript 闭包学习笔记

    javascript 闭包学习笔记

    一些情况下,函数返回 计算结果就行了 比如:

    function addAll(arr){
        return arr.reduce(function(x,y){
            return x+y;
        });
    }
    var arr = [1,3,4,5,6,7,8];
    console.log(addAll(arr));
    

    函数作为返回值

    function lazy_sum(arr){
        return function(){ // 参数和局部变量都保存在 返回的函数内部 
            return arr.reduce(function(x,y){return x+y;});
        }
    }
    var f = lazy_sum(arr); //这个函数得到的不是计算结果,而是算法/函数
    console.log(f); // [Function]
    console.log(f());  34
    

    这在 某些时候特别有用

    返回函数不要引用任何循环变量

    function count(){
        var arr = [];
        for(var i=1;i<=3;i++){ 
            arr.push(function(){
                return i*i; //等到返回的时候i已经变成了4 
            });
        }
        return arr;
    }
    var results = count();
    results.forEach(function(f){
        console.log(f()); ///16 16 16 
    });
    

    var 改 let

    function count(){
        var arr = [];
        for(let i=1;i<=3;i++){   // 如果var 改为let, i变成了块变量,i的作用域仅在for块了 
            arr.push(function(){
                return i*i; // 每一次循环里的i都是独立的
            });
        }
        return arr;
    }
    var results = count();
    results.forEach(function(f){
        console.log(f()); ///1 4 9
    });
    

    创建一个匿名函数并立刻执行

    function count(){
        var arr= [];
        for(var i=1;i<=3;i++){
            arr.push((function(n){
                return function(){
                    return n*n;
                };
            })(i));
        }
        return arr;
    }
    

    拆开写看清楚些

    function count(){
        var arr = [];
        function f(n){
            return function(){return n*n;}; // f(n)一执行则 n固定下来
        }
        for(var i=1;i<=3;i++){
            arr.push(f(i)); //不再是push进函数的定义,而是f(i)的执行结果
        }
        return arr;
    }
    var res = count();
    res.forEach(function(f){
        console.log(f()); //1 4 9
    });
    

    js中 创建一个匿名函数并立刻执行的写法

    理论上应该是

    f(n){
        return n*n
    }(3);
    

    但是由于JavaScript语法解析的问题,会报SyntaxError错误,因此需要用括号把整个函数定义括起来:

    (f(n){
        return n*n
    })(3);
    

    借助闭包,封装一个私有变量

    function create_counter(initNum){
        var x = initNum||0;
        return {
            //该闭包携带了局部变量x,并且,从外部代码根本无法访问到变量x
            inc:function(){
                x+=1;
                return x;
            }
        }
    }
    var c =  create_counter();
    console.log(c.inc());
    console.log(c.inc());
    console.log(c.inc());
    console.log(c.inc());
    

    闭包携带了局部变量x,并且,从外部代码根本无法访问到变量x。换句话说,闭包就是携带状态的函数,并且它的状态可以完全对外隐藏起来。

    小栗子

    function addNum(n){
        return function(x){
            return x+n;
        };
    }
    var add2 = addNum(2);
    var add10 = addNum(10);
    console.log(add2(1));
    console.log(add10(1));
    
  • 相关阅读:
    Bootstrap+Angularjs自制弹框
    【2019年04月22日】A股最便宜的股票
    沪深300指数的跟踪基金排名
    【2019年04月10日】股票的滚动市盈率PE最低排名
    【2019年04月09日】A股净资产收益率ROE最高排名
    基金 、社保和QFII等机构的重仓股排名评测
    【2019年04月04日】股市指数估值排名
    【2019年04月03日】A股最便宜的股票
    净资产收益率ROE连续3年超过15%的股票排名
    A股滚动净利润增速最高排名
  • 原文地址:https://www.cnblogs.com/ShawSpring/p/10789213.html
Copyright © 2011-2022 走看看