首页 > 其他分享 >闭包

闭包

时间:2022-11-17 10:15:25浏览次数:35  
标签:闭包 函数 作用域 局部变量 全局变量 变量

一、作用域

  • JavaScript作用域:分为全局作用域、局部作用域。变量在某个范围内起作用和效果,目的是为了提高程序的可靠性和减少命名冲突。

  • 变量的作用域:根据作用域的不同我们变量分为全局变量和局部变量。两种变量其主要区别是函数内部可以直接读取全局变量,但是在函数外部无法读取函数内部的局部变量。

  • 作用域链:

    • 根据内部函数可以访问外部函数变量的这种机制,用链式查找决定哪些数据能被内部函数访问,就称为作用域链

    • 只要是代码,就至少有一个作用域。

    • 写在函数内部的局部作用域。

    • 如果函数中还有函数,那么在这个作用域中就又可以诞生一个作用域。

1.全局变量
  • 概念:在全局作用域下的变量,在全局下都可以使用。
  • 如果在函数内部没有声明直接赋值的变量也属于全局变量。
  • 只有浏览器关闭的时,全局变量才会销毁,比较占内存资源。
    • 全局作用域:整个script标签中,或者是一个单独的js文件。
2.局部变量
  • 在局部作用域下变量,即在函数内部的变量就是局部变量,只能在函数内部使用。
  • 函数的形参也可以看做是局部变量。
  • 当我们程序执行完毕时,局部变量就会销毁,比较节约内存资源。
    • 局部作用域(函数作用域):在函数内部就是局部作用域,这个代码的名字(变量)只在函数内部起作用和效果。

二、理解闭包

1.闭包的概念
  • 闭包是指有权访问另外一个函数作用域中的局部变量的函数。声明在一个函数中的函数,叫做闭包函数。而且内部函数总是可以访问其所在的外部函数中声明的参数和变量,即使在其外部函数被返回(寿命终结)了之后。
2.闭包的特点
  • 让外部访问函数内部变量成为可能。
  • 局部变量会常驻在内存中。
  • 可以避免使用全局变量,防止全局变量污染。
  • 会造成内存泄漏(有一块内存空间被长期占用,而不被释放)。
3.闭包的分析
  • 闭包就是可以创建一个独立的环境,每个闭包里面的环境都是独立的,并且互不干扰。
  • 闭包会发生内存泄漏,每次外部函数执行的时候,外部函数的引用地址不同,都会重新创建一个新的地址。
  • 但当外部函数运行结束甚至销毁时,局部的变量key=value,尽管key被垃圾回收机制给回收了,但是value仍不会被回收,会变成一个自由变量留下引用的指针。
4.闭包的实现案例
  • 利用闭包的方式,输出点击项的索引值

    <ul class="closure">
        <li>苹果</li>
        <li>香蕉</li>
        <li>橘子</li>
        <li>西瓜</li>
    </ul>
    <script>
    	// 获取所有的li元素
    	let lis = document.querySelectorAll('.closure li')
        // 利用for循环创建了4个立即执行函数
        for (let i = 0; i < lis.length; i++) {
            (function (i) {
                lis[i].addEventListener('click', function () {
                    console.log(i)
                })
            })(i)
        }
    </script>
    
  • 利用闭包的方式,3秒钟之后,打印所有li元素的内容

    <ul class="closure">
        <li>苹果</li>
        <li>香蕉</li>
        <li>橘子</li>
        <li>西瓜</li>
    </ul>
    <script>
    	// 获取所有的li元素
    	let lis = document.querySelectorAll('.closure li')
        for (let i = 0; i < lis.length; i++) {
            (function (i) {
                setTimeout(() => {
                    console.log(lis[i].innerHTML)
                }, 3000)
            })(i)
        }
    </script>
    

标签:闭包,函数,作用域,局部变量,全局变量,变量
From: https://www.cnblogs.com/P1Kaj1uu/p/16898478.html

相关文章

  • go语言的内外函数(闭包结构)
    packagemainimport"fmt"/*一个外层函数中,有内层函数,该函数中,会操作外层函数的局部变量并且该外层函数的返回值就是这个内层函数这个内层函数和外层函数的局部变量,统称为......
  • 闭包是个好东西,巧用闭包实现数据绑定
    前言当你在工作中需要开发一个新的应用程序时,首先你会去考虑使用哪种设计模式,是MVC呢还是MVVM?当然这话放在今儿个说,大家肯定会一致的选择MVVM,因为相比MVC模式,MVVM模......
  • js闭包问题、js事件循环机制、async与defer、同步与异步模式
    js闭包问题定义:闭包就是有权访问其他函数作用域内的其他变量的函数。实现机制:在访问变量的函数中return一个匿名函数,这时匿名函数的作用域链将指向该函数的作用域。!!!由于......
  • C++面经 : C++ 11 新特性(闭包与匿名函数) ----C++ Closure & C++ anonymous functions
    关于C++Closure闭包和C++anonymousfunctions匿名函数什么是闭包?在C++中,闭包是一个能够捕获作用域变量的未命名函数对象,它包含了需要使用的“上下文”(函数......
  • 闭包与装饰器
    闭包:正常情况下,上例中a变量在return语句后,a变量会被释放。但由于内部inner函数继续调用a变量,导致a变量没有被释放。这种现象叫闭包defouter():a=1definner(......
  • 【JS基础】闭包
    概念:闭包是指有权访问另一个函数作用域中的变量的函数。在JS中,只有函数内部的子函数才能读取局部变量,所以闭包可以简单理解成‘定义在一个函数内部的函数’。 ......
  • JavaScript闭包详细讨论
    functiont1(){ varage=20; functiont2(){ alert(age); } returnt2;}在js中,t1执行过程中,又生成了t2,而从作用域上来说t2能访问到age=20,返回t2时,于是"a......
  • 闭包
    闭包(Closure)它与JavaScript中的垃圾回收(每门语言的垃圾回收是不一样的)有点联系什么是环境呢?就比如一个城市,在城市里面,我们会有很多设施:公园、医院、学校、商业广场.......
  • [JavaScript-09]闭包函数
    1.闭包函数//闭包函数vara=123;functionf1(){console.log(a);varb=234;functionf2(){console.log(b);}returnf2;}......
  • JS知识点梳理之作用域、作用域链、柯里化、闭包
    一、作用域与作用域链作用域是指js变量使用时所存在的一个区域,分为全局作用域(window)和局部作用域(function、setTimeout...等都会产生局部作用域)。当局部作用域变量名与......