• 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
  • 相关阅读:
    定义类或对象
    CSS 超出的文字显示省略号(单行、多行)
    获取Json对象的长度以及判断json对象是否为空
    第三次作业附加
    八皇后问题解题报告(dfs
    STL学习笔记(不定期更新)
    寒假作业之三
    寒假作业之二(2)
    寒假作业之二(1)
    第一篇随笔居然是总结耶
  • 原文地址:https://www.cnblogs.com/magicroc/p/5938764.html
Copyright © 2020-2023  润新知