• 闭包


    关于闭包
    定义:一个函数内部嵌套另一个函数,内部的函数引用了外面函数的局部变量,这样就形成了一个模型,叫做闭包
    闭包的作用是保护变量(变量私有化)缓存数据
    闭包会占用内存,闭包的内存是不会自动释放的!!!
    1.统计一个函数的执行次数
    var count = 0;
    function fn() {
    count++;
    console.log('我执行了' + count + '次');
    };
    fn();
    fn();
    fn();
    这样虽然可以实现效果,但count是全部变量,可能会受到污染,这样就会影响结果,而我们用闭包的写法就是如下:
    function outer() {
    var count = 0;
    function inner() {
    count++;
    console.log('我执行了' + count + '次');
    };
    return inner;
    };
    var result = outer();
    result();
    外面用outer函数将整个包裹起来,内部的函数inner引用了outer中的count,也就形成了闭包,保护了变量。闭包的内存是不会自动释放的,也就让count一直累加
    经常遇到的一些闭包写法
    点击按钮, 打印对应按钮的下标
    1.
    var btns = document.querySelectorAll('button');
    for (var i = 0; i < btns.length; i++) {
    btns[i].onclick = (function (i) {
    return function () {
    console.log(i);
    };
    })(i);
    }
    代码开始一行一行的执行,for循环中,当i=0时,btns[i].onclick后面的自调用函数也会执行,产生一块内存空间
    因为自调用函数内部的函数引用了自调用函数的i值,形成了闭包,这块内存空间不会自动释放,且同时也保护了自调用函数
    内的局部变量 i的值,for循环中i每执行一次都是开辟了一个新的内存空间,最终结果也就能打印出对应的下标
    2.
    var btns = document.querySelectorAll('button');
    for (var i = 0; i < btns.length; i++) {
    (function (i) {
    btns[i].onclick = function () {
    console.log(i);
    };
    })(i);
    }
    这种写法原理上和上一个写法是一样的,当for循环开始执行,每执行一次,内部的自调用函数也会执行
    当然自调用函数的内部函数引用了自调用函数的局部变量i,也就形成闭包,内存不会自动释放,同时保护了局部
    变量i不受影响,for循环结束,随之产生了对应个数的闭包,也能得到我们想要的结果。
  • 相关阅读:
    JavaScript复习总结二(函数)
    欢迎大家赐教
    windows下安装rabbitmq
    JAVA随机获取集合里的元素
    MySQL 【CAST】函数,类型转换使用
    驭犬术
    C#处理数码相片之马赛克的实现
    开场白
    女孩,当你说没有好男人时请看看
    一个字符美女
  • 原文地址:https://www.cnblogs.com/z-lin/p/10920889.html
Copyright © 2020-2023  润新知