美文网首页
闭包的理解

闭包的理解

作者: 东邪_黄药师 | 来源:发表于2021-09-23 22:59 被阅读0次

什么是闭包

闭包(closure)指有权访问另一个函数作用域中变量的函数。
①函数嵌套函数
②函数内部可以引用函数外部的参数和变量
③参数和变量不会被垃圾回收机制回收

function fn() {
        var num = 10;
        return function () {
            console.log(num);
        }
    }
    var f = fn();
    f();
image.png
注:我们fun 这个函数作用域 访问了另外一个函数 fn 里面的局部变量 num

2.闭包的作用

闭包的主要作用: 延伸了变量的作用范围

3.闭包的优缺点

  • 优点:可以隔离作用域不造成全局污染
  • 缺点:由于闭包长期驻留内存,则长期这样会导致内存泄露
    如何解决内存泄露:将暴露全外部的闭包变量置为null
    适用场景:封装组件,for循环定时器结合使用,for循环和dom事件结合.可以在性能优化的过程中,节流防抖函数的使用,导航栏获取下标的使用
    4.闭包的使用场景举例
  • 点击li输出当前li的索引号
<ul class="nav">
        <li>榴莲</li>
        <li>臭豆腐</li>
        <li>鲱鱼罐头</li>
        <li>大猪蹄子</li>
    </ul>
  var lis = document.querySelector('.nav').querySelectorAll('li');
        for (var i = 0; i < lis.length; i++) {
            // 利用for循环创建了4个立即执行函数
            // 立即执行函数也成为小闭包因为立即执行函数里面的任何一个函数都可以使用它的i这变量
            (function(i){
                lis[i].onclick = function() {
                    console.log(i)
                }

            })(i)
        }
  • 在定时器中使用闭包
<ul class="nav">
        <li>榴莲</li>
        <li>臭豆腐</li>
        <li>鲱鱼罐头</li>
        <li>大猪蹄子</li>
    </ul>
var lis = document.querySelector('.nav').querySelectorAll('li')
    for (var i = 0; i < lis.length; i++) {
            (function(i) {
                setTimeout(function() {
                    console.log(lis[i].innerHTML);
                }, 3000)
            })(i)
        }
  • 打车计算车费的场景(举例)
    1.闭包应用-计算打车价格
    2.打车起步价13(3公里内), 之后每多一公里增加 5块钱.
    3.用户输入公里数就可以计算打车价格
    4.如果有拥堵情况,总价格多收取10块钱拥堵费
var car = (function(){
        var start = 13; // 起步价  局部变量
        var total = 0; // 总价  局部变量
        return {
            // 正常的价格
            price:function (n) {
                if ( n<=3 ) {
                    total = start
                } else {
                    total = start + (n-3) * 5
                }
                return total
            },
            yd: function (flag) {
               return flag ? total + 10 : total
            }
        }
     })()
     console.log(car.price(5))
     console.log(car.price(4))
     console.log(car.yd(4))
image.png

相关文章

  • Gradle开发-Groovy闭包

    # 闭包 闭包的基础知识 闭包的使用 闭包 this,owner,delegate 的理解 总结 ## 闭包的基础...

  • Swift5 闭包及其应用

    关于如何理解闭包 学习闭包的第一个难点就是理解闭包,可能很多人用了很久的闭包都还不太清楚闭包到底是什么,我这里提供...

  • 【js基础修炼之路】— 深入浅出理解闭包

    之前对于闭包的理解只是很肤浅的,只是浮于表面,这次深究了一下闭包,下面是我对闭包的理解。 什么是闭包? 引用高程里...

  • JS闭包理解

    闭包的概念 闭包就是能够读取其他函数内部变量的函数。 一、变量的作用域 要理解闭包,首先必须理解Javascrip...

  • 自动闭包/逃逸闭包/非逃逸闭包

    自动闭包、逃逸闭包和非逃逸闭包三个概念有些不好理解,这里按我自己的理解总结一下,不对的地方请指正 一、非逃逸闭包:...

  • 闭包理解

    这次我发现了个奇怪的问题,高程经典的闭包陷阱,竟然是把一个未执行的函数赋值给了一个数组项,当年的我太年轻,竟然没看...

  • 理解闭包

    什么是「闭包」。 「闭包」的作用是什么。在一个立即执行函数当中: 首先,假设以上几行代码运行在立即执行函数当中,那...

  • 理解闭包

    什么是闭包?闭包是什么时候创建的?能不能看到闭包?从这三点出发学习。 在维基百科中的闭包:词法闭包的简称。是引用了...

  • 理解闭包

    spark 比较难得一个事情之一就是当在集群上执行代码的时候,变量和方法的范围和生命周期。Rdds 的操作 能够修...

  • 理解闭包

    欢迎移步我的博客阅读:《理解闭包》 闭包 是指可以包含自由(未绑定到特定对象)变量的代码块;这些变量不是在这个代码...

网友评论

      本文标题:闭包的理解

      本文链接:https://www.haomeiwen.com/subject/tddagltx.html