返回顶部
首页 > 资讯 > 精选 >JavaScript中的闭包是怎样的
  • 256
分享到

JavaScript中的闭包是怎样的

2023-06-22 03:06:03 256人浏览 薄情痞子
摘要

这篇文章给大家介绍javascript中的闭包是怎样的,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1. 闭包的概念来看一般函数的执行和启发:function stop() {  

这篇文章给大家介绍javascript中的闭包是怎样的,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

    1. 闭包的概念

    来看一般函数的执行和启发:

    function stop() {            var num = 0;            console.log(num);        }        stop(); // 打印出来num是0        console.log(num); // 报错 函数未定义

    此时,函数的外部无法访问函数内部的变量

     函数内部定义的变量不会一直存在,随着函数的运行结束而消失

    闭包的概念:

    是一个函数,这个函数有权访问另一个作用域中的变量。

    另一种说法,当内部函数的生命周期大于外部函数的声明周期,而内部函数以某一种方式被外部作用域访问时,闭包就产生了。

    来看如下闭包的代码和解释:

    function fn() {            var num = 10;            // function fun() {            //     console.log(num);             // }            // return fun;            return function () {                console.log(num); // 10            }        }        var f = fn();        f();

    我们可以拆解为几个部分:

    fn函数里面有内部的返回值且就是一个函数。

    return的这个函数内部打印了num变量。为什么能够打印num变量,原因在于作用域链的访问机制,下面会补充作用域和作用域链的知识点。

    我们在外部用f变量接受了fn(),也就是接受了fn的返回值【内部函数】

    紧接着调用f,也就是调用了fn里面的内部函数。最终能够打印10

    知识点的补充:

    1. 作用域:

    变量在某个范围内起作用,超出了这个范围,就不起作用。这个范围就是作用域。作用域在函数的定义时就产生,而不是函数调用时产生的。

    2. 作用域链:

    一句话概括:根据【内部函数可以访问外部函数变量】,采用就近原则一层一层向上查找变量,这个机制就叫作作用域链。

    函数A包含了函数B,那么函数B就是函数A的内部函数,

    而内部函数如果要使用一个变量,首先看自己内部有没有这个变量,

    如果没有,就会去紧挨着的上一级查找,【就近原则】

    如果函数一层一层都找不到,最后才会去全局变量下面找。

    var a = 1;        var b = 11;        function fn1() {            var a = 2;            var b = '22';            fn2();            function fn2() {                var a = 3;                fn3();                function fn3() {                    var a = 4;                    console.log(a); // 4                    console.log(b); // '22'                }            }        }        fn1();

    3. 垃圾回收机制

    可以参考这位大哥对于js垃圾回收机制的描述:

    //www.yisu.com/article/229425.htm

    我们结合这三个概念看闭包的作用

    2. 闭包的作用:

    我们把函数A叫作外层的函数,这个函数内部有一个函数B。

    外部用一个变量f接受函数A的返回值【函数B】

    而函数A作用域的变量叫作num

    能够在函数的外部访问函数内部的变量【搭建外部访问内部作用域的通道】

    原理:上面其实有解释过。

    第一要理解,作用链的原理看上面。函数B能够调用函数A的变量num

    第二要理解,首先函数A的返回值是函数B【内部函数】,其次这个返回值要在函数外部用变量f接受,接受以后就能够调用函数B,函数B就会访问函数A的变量num。而这个内部函数B就是闭包函数啦。

    能够延长函数内部变量的生命周期。

    第一个作用带来第二个作用。js的变量存在垃圾回收机制,如果函数执行完毕,变量会被清除,内存也会消除。可是如果利用闭包,变量可以不被立即清除。

    原因是,外部的变量f接受了一个函数A的内部函数B,而这个内部函数访问了函数A作用域的变量num,只要函数B执行且变量f一直存在,那么变量num就会一直存在。不会因为函数A的执行结束就消失。

    参考了下面的文章,讲的非常详细,推荐看。

    JavaScript闭包详解

    3. 闭包示例

    后面会补充闭包的一些应用。

    我们要想起什么场合用闭包,闭包不能滥用。

    3.1 点击li,输出当前li的索引

    <ul class="nav">        <li>榴莲</li>        <li>臭豆腐</li>        <li>鲱鱼罐头</li>        <li>大猪蹄子</li>    </ul>    <script>        // 闭包应用-点击li输出当前li的索引号        // 1. 我们可以利用动态添加属性的方式        var lis = document.querySelector('.nav').querySelectorAll('li');        for (var i = 0; i < lis.length; i++) {            lis[i].onclick = function () {                console.log(i); // 四个4            }        }    </script>

    原理:上图这样写,打印出来的i永远都是4。原因是,此时首先是非严格模式,在非严格模式下,for循环是同步执行任务,而按钮点击再执行是异步任务,同步执行完毕,i加到了4.再执行异步任务打印i,都是4。

    改法1:用闭包

    for循环生成四个立即执行函数

    立即执行函数是闭包的一种应用。立即执行函数里面的所有函数包括【点击 回调】函数都可以使用立即执行函数的传递的形参。

    for (var i = 0; i < lis.length; i++) {            (function (i) {                // console.log(i);                lis[i].onclick = function () {                    console.log(i);                 }            })(i);        }

    改法2:var--->let

    点击对应小li,打印i是对应索引号。使用let是es6语法,此时for有块级作用域

    var lis = document.querySelector('.nav').querySelectorAll('li');        for (let i = 0; i < lis.length; i++) {            lis[i].onclick = function () {                // console.log(i);                console.log(i);            }        }

    改法3:用设置自定义属性index的方法

    var lis = document.querySelector('.nav').querySelectorAll('li');        for (var i = 0; i < lis.length; i++) { // 注意这里是var不是let            lis[i].index = i; // 注意这里是lis[i]不是this.index,此时没有点击,哪里来的this            lis[i].onclick = function () {                console.log(this.index);            }        }

    关于JavaScript中的闭包是怎样的就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

    --结束END--

    本文标题: JavaScript中的闭包是怎样的

    本文链接: https://lsjlt.com/news/302158.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    猜你喜欢
    • JavaScript中的闭包是怎样的
      这篇文章给大家介绍JavaScript中的闭包是怎样的,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1. 闭包的概念来看一般函数的执行和启发:function stop() {  ...
      99+
      2023-06-22
    • JavaScript 函数的闭包是怎样的
      JavaScript 函数的闭包是怎样的,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。 前言我们知道,作用域链查找标识符的顺序是从当前作用域开始一级一级往上查找。...
      99+
      2023-06-16
    • 怎样解析javascript的闭包
      今天就跟大家聊聊有关怎样解析javascript的闭包,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。什么是闭包:闭包是一个存在内部函数的引用关系。该引用指向的是外部函数的局部变量对象...
      99+
      2023-06-29
    • JavaScript 闭包与高阶函数是怎样的
      JavaScript 闭包与高阶函数是怎样的,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。「JavaScript 中,函数是一等公民」,在各种...
      99+
      2024-04-02
    • JavaScript中的闭包
      一.什么是闭包 1.闭包的定义 闭包并不是JS特有的,因此可以从两个角度定义闭包。 1)计算机科学中 闭包又称为词法闭包(在进行词法分析的时候这个闭包就确定了),或者是函数闭包。是在支持头等函数的编程语言中(意思是函数作为一等公民的编程语言...
      99+
      2023-08-18
      javascript 前端 java
    • javascript中什么指的是闭包
      这篇文章主要为大家展示了“javascript中什么指的是闭包”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“javascript中什么指的是闭包”这篇文章吧。 ...
      99+
      2024-04-02
    • JavaScript中什么是闭包
      这篇文章给大家介绍JavaScript中什么是闭包,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。 一 、词法定义域 LexicalClosure闭包是编程语言Lexical ...
      99+
      2024-04-02
    • JavaScript中闭包的使用
      本篇内容介绍了“JavaScript中闭包的使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!通过深入了解...
      99+
      2024-04-02
    • JavaScript中的闭包closure怎么使用
      这篇文章主要介绍“JavaScript中的闭包closure怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“JavaScript中的闭包closure怎么使用”文章能帮助大家解决问题。闭包简述...
      99+
      2023-07-02
    • JavaScript中闭包怎么用
      这篇文章将为大家详细讲解有关JavaScript中闭包怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。闭包真的是学过一遍又一遍,Js博大精深,每次学习都感觉有新的收获...
      99+
      2024-04-02
    • 详解JavaScript中的闭包是如何产生的
      目录闭包的产生多个内部函数共享一个闭包对象结尾这次从内存管理的角度来看看,闭包是怎么产生的。 我们知道,在调用函数时,其实会产生临时的 调用栈。这些调用栈保存的是 执行上下本,并实际...
      99+
      2022-12-28
      JavaScript闭包如何产生 JavaScript闭包
    • Javascript闭包的作用是什么
      本篇内容主要讲解“Javascript闭包的作用是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Javascript闭包的作用是什么”吧!对于初学者来说,理...
      99+
      2024-04-02
    • Javascript闭包的特性是什么
      本篇内容介绍了“Javascript闭包的特性是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Java...
      99+
      2024-04-02
    • javascript的闭包是什么意思
      这篇文章将为大家详细讲解有关javascript的闭包是什么意思,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。 在javascript中,当两...
      99+
      2024-04-02
    • JavaScript中闭包的实现原理是什么
      这篇文章将为大家详细讲解有关JavaScript中闭包的实现原理是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。什么是闭包,为什么要用它?闭包是指有权访问另一个函数作...
      99+
      2024-04-02
    • javascript中浏览器是如何看闭包的
      小编给大家分享一下javascript中浏览器是如何看闭包的,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!前言闭包,是javascript的一大理解难点,网上关于...
      99+
      2023-06-25
    • JavaScript闭包是什么
      这篇文章给大家分享的是有关JavaScript闭包是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。概论在讨论ECMAScript闭包之前,先来介绍下函数式编程(与ECMA-2...
      99+
      2024-04-02
    • 什么是JavaScript闭包
      本篇内容主要讲解“什么是JavaScript闭包”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“什么是JavaScript闭包”吧!什么是闭包简言之,闭包是由函数...
      99+
      2024-04-02
    • JavaScript中的DOM是怎样的
      JavaScript中的DOM是怎样的,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。  其实就是操作 html 中的标签的...
      99+
      2024-04-02
    • 闭包的谜题:剖析 JavaScript 闭包中的常见问题
      闭包通过在内部函数中引用外部变量来捕获变量。当外部函数返回时,内部函数仍然可以访问这些外部变量,即使外部函数本身已被销毁。 问题 2:闭包的陷阱是什么? 内存泄漏:如果闭包持有对外部变量的引用,而外部变量又引用了一些大型对象,则即使外部函...
      99+
      2024-03-14
      闭包
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作