1.首先看一段代码:

var a = 1;

function fn1(){

  var b = 2;

  function fn2(){

    console.log(a);

    console.log(b);

  }

}

fn1();

我们在var b =2;这句代码打上断点,在chrome浏览器中进行调试,可以看到fn2这个函数对象有一个[[Scopes]]数组对象,里面有一个 Closure 对象,里面存放b: undefine这样一个值,也就是说保存了b变量,由于变量提升这时候还没有给b赋值,所以是undefined。这个Closure 对象就可以将其叫做fn2的闭包。

产生闭包的条件:1.闭包是在函数对象上面2.在函数定义的时候产生(不是调用的时候)3.函数是定义在另外一个函数的内部4.函数中的代码有引用外部函数定义的数据(函数/变量)

注:在上面的例子中fn2中引用了a,b变量,可以看作是通过作用域链向上找到的a,b变量,但是b变量会包含在fn2的闭包中,a变量不会,因为只是第一层外部函数并且不包括全局变量

2.上面的例子理解了闭包是什么,下面看一下闭包的一些用处

function fn1(){

  var b = 2;

  function fn2(){

    b++;

    console.log(b);

  }

  return fn2;

}

var fn3 = fn1();

fn3();

fn3();

上面的代码将一个包含闭包的内部函数fn2作为返回值返回了回来,这样我们就可以在外面操作fn2函数。按道理说fn1函数已经执行完毕了,应该将其作用上下文销毁,b变量应该已经访问不到了。但是由于fn2还未被销毁,因为外部有指向该函数的变量fn3,fn2中的闭包又包含了b变量,所以b变量得以延迟销毁。

上面的代码执行了两次fn3,即b++语句执行了两次。而代码运行的结果是:3 4 。说明两次执行fn3的时候操作的是用一个b变量,应为操作的b变量都是fn3的闭包上面的同一个变量。

另一个作用是,按道理在函数的外部应该是访问不到函数内部的数据的(变量/函数),但是通过这种闭包的方式我们就可以在外部访问到内部的数据了。

总的来说闭包的作用:1.延长了函数内变量的销毁时间2.使外部操作函数内部的数据成为可能

JS闭包(1)的更多相关文章

  1. js闭包的作用域以及闭包案列的介绍:

    转载▼ 标签: it   js闭包的作用域以及闭包案列的介绍:   首先我们根据前面的介绍来分析js闭包有什么作用,他会给我们编程带来什么好处? 闭包是为了更方便我们在处理js函数的时候会遇到以下的几 ...

  2. 大部分人都会做错的经典JS闭包面试题

    由工作中演变而来的面试题 这是一个我工作当中的遇到的一个问题,似乎很有趣,就当做了一道题去面试,发现几乎没人能全部答对并说出原因,遂拿出来聊一聊吧. 先看题目代码: function fun(n,o) ...

  3. Js闭包常见三种用法

        Js闭包特性源于内部函数可以将外部函数的活动对象保存在自己的作用域链上,所以使内部函数的可以将外部函数的活动对象占为己有,可以在外部函数销毁时依然存有外部函数内的活动对象内容,这样做的好处是可 ...

  4. js闭包之初步理解( JavaScript closure)

    闭包一直是js中一个比较难于理解的东西,而平时用途又非常多,因此不得不对闭包进行必要的理解,现在来说说我对js闭包的理解. 要理解闭包,肯定是要先了解js的一个重要特性, 回想一下,那就是函数作用域, ...

  5. (原创)JS闭包看代码理解

    <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="C ...

  6. js闭包理解

    js闭包的作用是使函数外可以访问函数内部的变量,是通过 在函数内部 定义 访问函数内变量 的函数实现的,内部的一个函数产生一个闭包 function a() { var i=0; return fun ...

  7. js闭包理解实例小结

    Js闭包 闭包前要了解的知识  1. 函数作用域 (1).Js语言特殊之处在于函数内部可以直接读取全局变量 <script type="text/javascript"> ...

  8. Js闭包的用途

    本来想总结一点JavaScript中的闭包的一些用法,在查资料的时候发现了一篇很好的文章,就转过来收藏了,下面附上传送门: js闭包的用途 ---------sunlylorn 我们来看看闭包的用途. ...

  9. js闭包和ie内存泄露原理

    也议 js闭包和ie内存泄露原理 可以, 但小心使用. 闭包也许是 JS 中最有用的特性了. 有一份比较好的介绍闭包原理的文档. 有一点需要牢记, 闭包保留了一个指向它封闭作用域的指针, 所以, 在给 ...

  10. js闭包(closure),个人理解

    一.闭包概念理解 各种专业文献上对js"闭包"(closure)定义非常抽象,贼难看懂.我的理解是,闭包就是能够读取某函数内部变量的函数.由于在Javascript语言中只有在函数 ...

随机推荐

  1. SpringBoot踩坑记(HTTP 400 错误)

    HTTP 400 错误 复现错误 ajax请求后台数据时有时会报 HTTP 400 错误 - 请求无效 (Bad request);出现这个请求无效报错说明请求没有进入到后台服务里:原因:1)前端提交 ...

  2. 原生JS实现旋转木马轮播图特效

    大概是这个样子: 首先来简单布局一下(emm...随便弄一下吧,反正主要是用js来整的) <!DOCTYPE html> <html lang="en"> ...

  3. 一周搞定模拟电路P3_电容_记录

    1 电容的介绍 什么是电容 它有两个电极板,和中间板所夹的介质封装而成,具有特定功能的电子器件. 电容的作用 旁路.去耦.滤波和储能的作用 2 旁路电容的作用 1)使输入电压均匀化,减少噪声对后级的影 ...

  4. Comparable

    为什么会有Comparable与Comparator接口? 引入策略模式   目录 引入 Comparable接口的来龙去脉 引入Comparator接口 什么是策略模式? 使用了策略模式有什么好处? ...

  5. Win下PHP5.6版本安装redis扩展

    首先说一下自己的环境啥的,我用的是phpstudy,其实没啥大用,就是看你的php版本啥的 1.运行phpinfo(),查看php的信息,php的位数和扩展信息,和要下载的扩展文件信息有关, 2.下载 ...

  6. 搭建robotframework环境

    1.安装rf 执行命令:pip install robotframework; 2.安装seleniumlibrary库 执行命令:pip install --upgrade robotframewo ...

  7. Django 字段中 null 和 blank的区别

    blank 设置为 True 时,字段可以为空 设置为 False 时,字段是必须填写的 默认为 False null 设置为 True 时,数据库的字段允许为NULL,而且表单中的空值将会被存储为N ...

  8. 00-Docker基本安装

    目录 00-Docker基本安装 参考 安装与配置 启动与测试 00-Docker基本安装 Docker Version: 19.03.5

  9. 使用SQL计算宝宝每次吃奶的时间间隔(数据保障篇)

    目前程序从功能上其实已经完全满足客户(当然我这里的客户都是指媳妇儿^_^)需求,具体可参考: 使用SQL计算宝宝每次吃奶的时间间隔 使用SQL计算宝宝每次吃奶的时间间隔(续) 那么本篇 使用SQL计算 ...

  10. 复变函数知识总结(2)——Cauchy理论

    复变函数知识总结(2)——Cauchy理论 版本:2020-01-01 此版本不是最终版本,还有后续的补充和更新. 如有错误请指出,转载时请注明出处! page1 page2 page3 page4 ...