zoukankan      html  css  js  c++  java
  • JavaScript闭包

    闭包 :相关参数和变量都保存在返回的函数中,这种称为“闭包(Closure)
              1. 函数作为返回值 。      
              var a = [1,2,3,4,5]
    var fun = function(arr)
    {
        var sum = function()
        {
            var s = 0;
            for(var i of arr)
            {
                s = s + i;
            }
            return s;
        }
        return sum;
    }
    var f = fun(a)
    alert(f())//15
    每次调用都会返回一个新的函数,即使传入相同的参数。
     
    2. 返回的函数并没有立刻执行,而是直到调用了f()才执行。
    var fun1=function()
    {
        var arr = [],i;
        for(i=1;i<4;i++)
        {
            arr.push(function()
                {return i*i;})
        }
        return arr;
    }
    var ar = fun1();
    f1 = ar[0];
    f2 = ar[1];
    f3 = ar[2];
    alert(f1()) //16
    alert(f2()) //16
    alert(f3())//16
    因为函数最开始没有执行,当执行的时候i的值已经是4了,这三个函数都根据i的引用得到了16。解决办法 方法是再创建一个函数,用该函数的参数绑定循环变量当前的值,无论该循环变量后续如何更改,已绑定到函数参数的值不变。看下面
     
    var fun1=function()
    {
        var arr = [],i;
        for(i=1;i<4;i++)
        {
            arr.push((function(n)
                {
                    return function()
                    {return n*n;}
                })(i));//创建一个函数并立即执行
        }
        return arr;
    }
    var ar = fun1();
    f1 = ar[0];
    f2 = ar[1];
    f3 = ar[2];
    alert(f1()) //1
    alert(f2()) //4
    alert(f3()) //9
     
     
    一个立即执行的匿名函数:
    (function (x) {
        return x * x;
    })(3);
         
    3.封装一个私有变量
         var fun2 = function(init)
    {
        var x = init||0;
        return {
            incou:function () {
                x = x+1;
                return x;
            }
        }
    }
     
    var p = fun2()
    alert(p.incou()) //1
    alert(p.incou()) //2
    var pe = fun2(10)
    alert(pe.incou()) //11
    alert(pe.incou())//12
    闭包就是携带状态的函数,并且它的状态可以完全对外隐藏起来。
     
     
    4. 闭包把多参数的函数变成单参数的函数。
    function fun3(x)
    {
        function fun(n)
            {
                return Math.pow(n,x)
            }
        return fun;
    }
    var pow2 = fun3(2)
    var pow3 = fun3(3)
    alert(pow2(5)) //25
    alert(pow3(5)) //125
  • 相关阅读:
    linux du命令
    Linux vmstat命令实战详解
    linux sar命令详解
    xargs 命令教程
    Linux中find命令用法大全
    python suprocess
    Python的f-strings格式化
    python glob的使用
    python getopt()的使用
    Java测试的题目感想
  • 原文地址:https://www.cnblogs.com/magicroc/p/5938764.html
Copyright © 2011-2022 走看看