不说官方给的定义,感觉自己刚开始看也不是很理解。

闭包 : 其实就是 该函数能使用函数外定义的变量。

为什么要使用闭包?

首先来说一下局部变量和全局变量的危害: 全局变量容易全局污染,局部变量又无法共享,不能长久保存

那闭包实现了一个什么?

既可以共享,长久保存,又不会全局污染,其实是用来保护局部变量的。

闭包有什么缺点?

占内存,至于为什么占内存,稍后会画内存图来说明。

如果说你要写一个闭包,就是抓住闭包的三个特点:

  1. 定义外层函数,封装被保护的局部变量
  2. 定义内层函数,执行对局部变量(外层函数的)的操作
  3. 外层函数返回内层函数的对象,并且外层函数被调用,结果保存在全局变量中
function outer(){
var n = 1;
function inner(){
return n++;
}
return inner;
}
var getNum = outer();

所以说在你判断闭包的时候一般是看以下三点:

  1. 嵌套函数
  2. 内层函数一定操作了外层函数的局部变量
  3. 外层函数将内层函数返回到外部,被全局变量保存住

那一个闭包我们又如何去判断他的执行结果呢?

  1. 外层函数被调用了几次,就有几个受保护的局部变量副本
  2. 来自一个闭包的函数被调用几次,受保护的局部变量就变化几次

比如刚刚那个例子来说:

function outer(){
var n = 1;
function inner(){
return n++;
}
return inner;
}
var getNum = outer();
//外层函数调用一次,有一个被保护的n
console.log(getNum());
//
console.log(getNum());
//
var getNum2 = outer();
//外层函数被调用两次,有两个互不干扰的n
console.log(getNum2());
//

内存图:

  创建函数的同时会创建两个对象:

        函数对象:函数的定义  (老板)

        作用域链对象:保存了函数对象可用的变量的位置的对象(栈),默认第一项指向window(管理员)

  而调用函数时,又会创建一个新对象

        活动对象:专门保存局部变量的对象(这里说一下函数中的局部变量指的是  参数  和  var声明的)

        在作用域链对象中追加指向活动对象的引用

  调用后:仅仅释放了活动对象,作用域链中活动对象的引用出栈,活动对象因无人引用而释放

      (也就是说内存图中,某一块当没有人指入它时,就会被释放)

除去释放后的部分:

可见如果有闭包的存在,其实是很占内存的,它会形成这种循环的指入,使得无法被释放

说一说js中的闭包的更多相关文章

  1. 详解js中的闭包

    前言 在js中,闭包是一个很重要又相当不容易完全理解的要点,网上关于讲解闭包的文章非常多,但是并不是非常容易读懂,在这里以<javascript高级程序设计>里面的理论为基础.用拆分的方式 ...

  2. js中的闭包之我理解

    闭包是一个比较抽象的概念,尤其是对js新手来说.书上的解释实在是比较晦涩,对我来说也是一样. 但是他也是js能力提升中无法绕过的一环,几乎每次面试必问的问题,因为在回答的时候.你的答案的深度,对术语的 ...

  3. 浅谈JS中的闭包

    浅谈JS中的闭包 在介绍闭包之前,我先介绍点JS的基础知识,下面的基础知识会充分的帮助你理解闭包.那么接下来先看下变量的作用域. 变量的作用域 变量共有两种,一种为全局变量,一种为局部变量.那么全局变 ...

  4. js中的“闭包”

    js中的“闭包” 姓名:闭包 官方概念:闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分. ( ⊙o⊙ )!!!这个也太尼玛官方了撒,作为菜鸟的 ...

  5. JS中的闭包(closure)

    JS中的闭包(closure) 闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现.下面就是我的学习笔记,对于Javascript初学者应该是很有用 ...

  6. Js中的闭包原理

    要了解清楚js中的闭包制机,那么得先了解全局执行环境.块级执行环境.函数执行环境.变量对象.环境栈.作用域链.摧毁执行环境. 全局执行环境 全局执行环境指的是最外层的执行环境.在web中全局执行环境被 ...

  7. js中的闭包理解一

    闭包是一个比较抽象的概念,尤其是对js新手来说.书上的解释实在是比较晦涩,对我来说也是一样. 但是他也是js能力提升中无法绕过的一环,几乎每次面试必问的问题,因为在回答的时候.你的答案的深度,对术语的 ...

  8. js中的闭包理解

    闭包是一个比较抽象的概念,尤其是对js新手来说.书上的解释实在是比较晦涩,对我来说也是一样. 但是他也是js能力提升中无法绕过的一环,几乎每次面试必问的问题,因为在回答的时候.你的答案的深度,对术语的 ...

  9. 初识js中的闭包

    今天看了关于js闭包方面的文章,还是有些云里雾里,对于一个菜鸟来说,学习闭包确实有一定的难度,不说别的,能够在网上找到一篇优秀的是那样的不易. 当然之所以闭包难理解,个人觉得是基础知识掌握的不牢,因为 ...

  10. 理解js中的闭包

    闭包 我的理解是 能够有权访问另一个函数作用域中变量的函数 通常我们知道 普通的函数在调用完成之后,活动对象不会从内存中销毁,其执行环境的作用域链会被销毁,造成资源的浪费 而闭包的好处就在于执行完就会 ...

随机推荐

  1. sqllite中实现字符串分割

    WITH split(word, str) AS (    -- alternatively put your query here    -- SELECT '', category||',' FR ...

  2. 7、Dockerfile详解

    参考: https://www.imooc.com/article/details/id/25229 https://www.cnblogs.com/panwenbin-logs/p/8007348. ...

  3. IDEA搭建基于maven的springboot工程

    ---恢复内容开始--- 基础环境:IntelliJ IDEA 2018.1.6 x64.JDK1.8 一.创建maven 填写包名.项目名 选择对应的本地maven 默认过来的project nam ...

  4. 北京AI外包团队 祝大家2019事业有事,大吉大利!

    未来已来,以人工智能为核心的科技力量,在重新塑造着我们生活的环境.这种重新塑造的现象如此之明显,力量如此强大,以至于越来越多的人在讨论,我们面临着新一轮的工业革命.而且现在我们面临的这次新的科技力量, ...

  5. echarts生成的图表大小怎么随屏幕的大小改变自适应

    最近在做图表,记录一下用到的知识点,当做自己的日记吧,会不断添加新内容 1,echarts生成的图表大小怎么随屏幕的大小改变自适应? this.chart.setOption(this.options ...

  6. Android 简单记事本

    写在前面 课程作业需要,于是忙活好几天抄了一个简单的记事本,使用已学内容包括Android UI布局,Activity的跳转,SQLite数据库. 开发环境:Android Studio 参考:htt ...

  7. 怎么样启用红米手机5的ROOT权限

    红米手机5能如何拥有了root超级权限?各位清楚,android机器有root超级权限,一旦手机拥有了root相关权限,就能够实现更强的功能,举个栗子各位公司的营销部门的妹纸,使用较多营销工具都需要在 ...

  8. git 三步走

    git三步走: git add .        (注:别忘记后面的.,此操作是把Test文件夹下面的文件都添加进来) git commit  -m  "提交信息"  (注:“提交 ...

  9. SQLite使用笔记

    前言 客户端存储信息的方法有好多种,在以往的项目中采用的是序列化记录到文件中的方式,即时通信项目中客户端的一些系统配置的保存也使用的这种方式,然而客户端保存聊天记录就不能使用这种方式(保存.读取.修改 ...

  10. EF中关于日期字值的处理

    一.SQL语句方式 var datefrom = DateTime.Parse(fromdate);   var dateto = DateTime.Parse(todate); var sql = ...