深入了解什么是JS中的闭包

什么是闭包?相信很多人听了有点懵,然后去百度查了一下官方的定义“闭包就是能够读取其他函数内部变量的函数”发现感觉自己更懵了。关于闭包如果只看那官方的定义的话确实不是让人很容易理解。

要想理解什么是闭包,首先得弄清楚什么是作用域,作用域可以理解为一个变量可以使用的范围。

在 JavaScript 中有两种作用域类型:

在 JavaScript 函数中声明的变量会成为函数的局部变量。局部变量的作用域是局部的所以只能在函数内部访问它们。

函数外声明的变量属于全局变量。全局变量的作用域是全局的所以网页的任意部分和函数都能够访问它。

有了作用域做铺垫,再来学习闭包就容易多了。

function f1(){    var n=10;//局部变量n //在f1函数内部声明的f2函数    function f2(){      alert(n);    }    return f2;//将f2函数作为f1函数的返回值  }  var fobj=f1();//f1调用完后的返回值是一个f2函数,此时fobj就是f2函数  fobj(); // 输出10,调用f2函数

上述代码就是一个简单的闭包函数,闭包的用处有两个,一个是可以读取函数内部的变量,另一个就是在内存中让这些变量的值始终保持。

  function f1(){    var n=5;//局部变量n    add=function(){ //fdd前面没有使用var关键字,因此add是一个全局变量的匿名函数 n+=1 } //在f1函数内部声明的f2函数    function f2(){      alert(n);    }    return f2;  }  var fadd=f1();  result(); // 输出5  add();  fadd(); // 输出6

从上面这段代码中可以看出,fadd就是闭包f2函数。它一共运行了两次,第一次的值是5,第二次的值是6。这证明函数f1中的局部变量n一直保存在内存中,并没有在f1调用后被自动清除。因为f1是f2的父函数,而f2相当于赋给了f1一个全局变量,所以f2一直在内存中。而f2的存在又依赖于f1,因此f1也一直在内存中,不会在调用结束后回收。

由于闭包会使函数中的变量都被保存在内存中,导致内存消耗很大,造成网页的性能问题,在IE中还可能导致内存泄露,所以不能滥用闭包,在退出函数之前,将不使用的局部变量全部删除。

郑重声明:本文内容及图片均整理自互联网,不代表本站立场,版权归原作者所有,如有侵权请联系管理员(admin#wlmqw.com)删除。
(0)
用户投稿
上一篇 2022年6月30日
下一篇 2022年6月30日

相关推荐

  • 超详细1000左右手机选购攻略,买对不买贵

    超详细1000左右手机选购攻略,买对不买贵 现在手机越来越贵,不仅iPhone贵,国产手机也贵,旗舰机都是大几千。贵手机虽然配置高用着爽,但钱包受不了。相反,很多千元机都是高配低价…

    2022年8月5日
  • 512G或被迫成刚需!谁是“内存刺客”?你有过储存不足被迫换机吗

    曾几何时,512G的机型只是少数人的选择,在当时128G完全可以满足各种日常使用,上256G的大部分都是游戏党或下载党,那会大家为内存买单的意愿还不是很大。可是在软件体积膨胀数倍的…

    2022年9月20日
  • 嵌入式开发工程师必备:有限状态机

    有限状态机示意图(Finite State Machines)图片来源:flaviocopes.com 作者 | Peter Galan “ 获取有关使用C语言为嵌入式系统的有限状…

    2022年6月17日
  • 曾经的父爱铭记于心

    光阴荏苒,岁月不居,在一年一度的清明节将临之际,我都会情不自禁地产生联想,也有些许思念或感慨、感怀乃至回忆,当然更多的则是思绪如潮,不仅因为这些日子有多特别,也不是因此而想到或回忆…

    2022年4月20日
  • Chrome(谷歌浏览器)如何截屏整个页面不用插件

    Chrome(谷歌浏览器)如何截屏整个页面不用插件?相信很多朋友们也遇到过这种类似的问题,那么对于这类问题如何解决呢?下面就把解决这种问题的方法给大家分享一下,希望可以帮助到大家。…

    2022年5月1日
  • shell 中各种括号的作用()、(())、「」、「「」」、「」

    一、小括号,圆括号 () 1、单小括号 () 命令组。括号中的命令将会新开一个子shell顺序执行,所以括号中的变量不能够被脚本余下的部分使用。括号中多个命令之间用分号隔开,最后一…

    2022年7月4日
  • 养肝的几种食物

    现代人们都会选择吃一些对身体健康非常好的食物来预防一些疾病的产生。对于维持肝脏的健康,能够起到保肝护肝作用的食物非常的多,比如说鸡肝就是一款以肝养肝的好食材,另外海带和茼蒿也能够起…

    2022年8月31日
  • AI课堂第16讲:DL深度学习-PyTorch计算图与模型构造

    前面几节我们学习了深度学习模型的基本原理与实现,下面我们继续学习深度学习计算的各个组成部分,为后续学习复杂模型打下基础。 在学习模型构造之前,我们先了解一下什么是计算图。 计算图 …

    2022年7月6日
  • 前端或开发人员一定要会,谷歌浏览器20个扩展程序

    相信我谷歌浏览器是浏览器里绝对最好的,想用好浏览器一定要知道这20个有用的扩展程序。 1.CSS查看器 CSS Viewer是一个简单但非常有效的 Web 开发者 Chrome 扩…

    2022年6月25日
  • 2.25 NS记录 2.26 主要记录类型

    2.25 NS记录 1.每个主要或辅助域名服务器都应保存有你的zone和一个NS记录。 2.NS记录指向任何辅助域名服务器,如果主域名服务器损坏,辅助域名服务器将被启用。 @ IN…

    2022年6月27日

联系我们

联系邮箱:admin#wlmqw.com
工作时间:周一至周五,10:30-18:30,节假日休息