返回顶部
首页 > 资讯 > 精选 >JavaScript闭包哟哪些用途及怎么实现
  • 920
分享到

JavaScript闭包哟哪些用途及怎么实现

2023-07-05 22:07:39 920人浏览 八月长安
摘要

这篇文章主要介绍了javascript闭包哟哪些用途及怎么实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇JavaScript闭包哟哪些用途及怎么实现文章都会有所收获,下面我们一起来看看吧。一、闭包的概念当通

这篇文章主要介绍了javascript闭包哟哪些用途及怎么实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇JavaScript闭包哟哪些用途及怎么实现文章都会有所收获,下面我们一起来看看吧。

    一、闭包的概念

    当通过调用外部函数返回的内部函数后,即使外部函数已经执行结束了,但是内部函数引用了外部函数的变量依然会保存在内存中,我们把这些变量的集合,称为闭包(Closure)。

    在了解闭包的概念和用途之前,理解作用域和变量的生命周期等基础预备知识,对于理解闭包非常有帮助。

    二、怎么实现闭包

    闭包是指一个函数可以访问它定义时所在的词法作用域以及全局作用域中的变量。在JavaScript中,闭包可以通过函数嵌套和变量引用实现。

    function outerFunction() {    let outerVariable = '我在outer函数里!';      function innerFunction() {      console.log(outerVariable);    }      return innerFunction;  }    const innerFunc = outerFunction();  innerFunc(); // 输出: 我在outer函数里!

    在上面的代码示例中,innerFunction引用了outerVariable,因此JavaScript引擎会保留outerFunction的作用域链,以便innerFunction可以访问outerVariable

    function a(){    function b(){        var bb = 888        console.log(aa);  //输出:666    }    var aa = 666    return b}var demo = a()demo()

    在上面的代码示例中,a函数定义了一个名为aa的变量和一个名为b的函数,b函数引用了aa变量,因此JavaScript引擎会保留a函数的作用域链,b函数可以访问a函数的执行上下文,b函数内用到了外部函数a的变量aa,在a函数调用结束后该函数执行上下文会销毁,但会保留一部分留在内存中供b函数使用,这就形成了闭包。

    具体来说,当内部函数引用外部函数的变量时,外部函数的作用域链将被保留在内存中,以便内部函数可以访问这些变量。 这种函数嵌套和变量共享的方式就是闭包的核心概念。当一个函数返回另一个函数时,它实际上返回了一个闭包,其中包含了原函数定义时的词法作用域和相关变量。

    三、闭包的用途

    1.封装私有变量

    闭包可以用于封装私有变量,以防止其被外部访问和修改。封装私有变量可以一定程度上防止全局变量污染,使用闭包封装私有变量可以将这些变量限制在函数内部或模块内部,从而减少了全局变量的数量,降低了全局变量被误用或意外修改的风险。

    在下面这个例子中,调用函数,输出的结果都是1,但是显然我们的代码效果是想让count每次加一的。

    function add() {    let count = 0;    count++;    console.log(count);}add()   //输出1add()   //输出1add()   //输出1

    一种显而易见的方法是将count提到函数体外,作为全局变量。这么做当然是可以解决问题,但是在实际开发中,一个项目由多人共同开发,你不清楚别人定义的变量名称是什么,这么做有点冒险,有什么其他的办法可以解决这个问题呢?

    function add(){    let count = 0    function a(){        count++        console.log(count);    }    return a}var res = add() res() //1 res() //2res() //3

    答案是用闭包。在上面的代码示例中,add函数返回了一个闭包a,其中包含了count变量。由于count只在add函数内部定义,因此外部无法直接访问它。但是,由于a函数引用了count变量,因此count变量的值可以在闭包内部被修改和访问。这种方式可以用于封装一些私有的数据和逻辑。

    2. 做缓存

    函数一旦被执行完毕,其内存就会被销毁,而闭包的存在,就可以保有内部环境的作用域。

    function foo(){    var myName ='张三'    let test1 = 1    const test2 = 2     var innerBar={        getName: function(){            console.log(test1);            return myName        },        setName:function(newName){            myName = newName        }    }    return innerBar}var bar = foo()   console.log(bar.getName()); //输出:1 张三bar.setName('李四')console.log(bar.getName()); //输出:2 李四

    这里var bar = foo() 执行完后本来应该被销毁,但是因为形成了闭包,所以导致foo执行上下文没有被销毁干净,被引用了的变量myName、test1没被销毁,闭包里存放的就是变量myName、test1,这个闭包就像是setName、getName的专属背包,setName、getName依然可以使用foo执行上下文中的test1和myName。

    3. 模块化编程(实现共有变量)

    闭包还可以用于实现模块化编程。模块化编程是一种将程序拆分成小的、独立的、可重用的模块的编程风格。闭包可以用于封装模块的私有变量和方法,以便防止其被外部访问和修改。例如:

    const myModule = (function() {  let privateVariable = '我是私有的!';  function privateMethod() {    console.log(privateVariable);  }  return {    publicMethod: function() {      privateMethod();    }  };})();myModule.publicMethod(); // 输出: 我是私有的!

    在上面的代码示例中,myModule实际上是一个立即执行的匿名函数,它返回了一个包含publicMethod的对象。在函数内部,定义了一个私有变量privateVariable和一个私有方法privateMethod。publicMethod是一个公共方法,它可以访问privateMethod,但是无法访问privateVariable。这种方式可以用于实现简单的模块化编程。

    四、闭包的缺点

    闭包也存在着一个潜在的问题,由于闭包会引用外部函数的变量,但是这些变量在外部函数执行完毕后没有被释放,那么这些变量会一直存在于内存中,总的内存大小不变,但是可用内存空间变小了。 一旦形成闭包,只有在页面关闭后,闭包占用的内存才会被回收,这就造成了所谓的内存泄漏

    因此我们在使用闭包时需要特别注意内存泄漏的问题,可以用以下两种方法解决内存泄露问题:

    及时释放闭包:手动调用闭包函数,并将其返回值赋值为null,这样可以让闭包中的变量及时被垃圾回收器回收。

    使用立即执行函数:在创建闭包时,将需要保留的变量传递给一个立即执行函数,并将这些变量作为参数传递给闭包函数,这样可以保留所需的变量,而不会导致其他变量的内存泄漏。

    关于“JavaScript闭包哟哪些用途及怎么实现”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“JavaScript闭包哟哪些用途及怎么实现”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网精选频道。

    --结束END--

    本文标题: JavaScript闭包哟哪些用途及怎么实现

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

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

    猜你喜欢
    • JavaScript闭包哟哪些用途及怎么实现
      这篇文章主要介绍了JavaScript闭包哟哪些用途及怎么实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇JavaScript闭包哟哪些用途及怎么实现文章都会有所收获,下面我们一起来看看吧。一、闭包的概念当通...
      99+
      2023-07-05
    • JavaScript闭包是什么及怎么用
      这篇“JavaScript闭包是什么及怎么用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“JavaScript闭包是什么及怎...
      99+
      2023-07-04
    • JavaScript中闭包的作用有哪些
      JavaScript中闭包的作用有哪些?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。JavaScript是什么JavaScript是一种直译式的脚本语言,其解释...
      99+
      2023-06-14
    • JavaScript中闭包怎么用
      这篇文章将为大家详细讲解有关JavaScript中闭包怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。闭包真的是学过一遍又一遍,Js博大精深,每次学习都感觉有新的收获...
      99+
      2024-04-02
    • JavaScript中怎么应用闭包
      JavaScript中怎么应用闭包,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。什么是闭包(Closure)简单讲,闭包就是指有权访问另一...
      99+
      2024-04-02
    • Python闭包怎么实现
      本篇内容介绍了“Python闭包怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1、闭包的概念请大家跟我理解一下,如果在一个函数的内部...
      99+
      2023-06-29
    • JavaScript中闭包的实现原理是什么
      这篇文章将为大家详细讲解有关JavaScript中闭包的实现原理是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。什么是闭包,为什么要用它?闭包是指有权访问另一个函数作...
      99+
      2024-04-02
    • JavaScript中的闭包closure怎么使用
      这篇文章主要介绍“JavaScript中的闭包closure怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“JavaScript中的闭包closure怎么使用”文章能帮助大家解决问题。闭包简述...
      99+
      2023-07-02
    • python函数及闭包是什么及怎么用
      本篇内容主要讲解“python函数及闭包是什么及怎么用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“python函数及闭包是什么及怎么用”吧!函数对象函数对象指...
      99+
      2024-04-02
    • JavaScript如何使用闭包实现私有变量
      这篇文章主要介绍JavaScript如何使用闭包实现私有变量,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!使用闭包实现私有变量function Person(name,&n...
      99+
      2024-04-02
    • JavaScript闭包和作用域链的定义实现
      目录引言闭包的定义和实现作用域链闭包和作用域链的关系使用闭包的注意事项结论引言 在JavaScript中,每个函数都有自己的作用域。作用域规定了哪些变量和函数可以在当前函数内部访问。...
      99+
      2023-05-20
      JavaScript闭包作用域链 JavaScript作用域链
    • Golang中的闭包怎么实现
      这篇文章主要介绍了Golang中的闭包怎么实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Golang中的闭包怎么实现文章都会有所收获,下面我们一起来看看吧。1、什么是闭包?在真正讲述闭包之前,我们先铺垫一点...
      99+
      2023-07-04
    • JavaScript中闭包的概念、原理及作用是什么
      本篇内容主要讲解“JavaScript中闭包的概念、原理及作用是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JavaScript中闭包的概念、原理及作用是...
      99+
      2024-04-02
    • C++项目中怎么实现闭包
      今天就跟大家聊聊有关C++项目中怎么实现闭包,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。示例#include <iostream>#include ...
      99+
      2023-06-19
    • javascript的选择器有哪些及怎么用
      今天小编给大家分享一下javascript的选择器有哪些及怎么用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我...
      99+
      2024-04-02
    • JavaScript循环语句有哪些及怎么用
      今天小编给大家分享一下JavaScript循环语句有哪些及怎么用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我...
      99+
      2024-04-02
    • JavaScript运算符有哪些及怎么使用
      这篇“JavaScript运算符有哪些及怎么使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这...
      99+
      2024-04-02
    • JavaScript基础语法有哪些及怎么用
      本篇内容主要讲解“JavaScript基础语法有哪些及怎么用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JavaScript基础语法有哪些及怎么用”吧!JavaScript 基本语法JS 与 ...
      99+
      2023-06-27
    • javascript中的运算符有哪些及怎么用
      今天小编给大家分享一下javascript中的运算符有哪些及怎么用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面...
      99+
      2024-04-02
    • javascript的集合类型有哪些及怎么用
      这篇文章主要介绍了javascript的集合类型有哪些及怎么用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇javascript的集合类型有哪些及怎么用文章都会有所收获,下面我...
      99+
      2024-04-02
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作