本次主要内容是 闭包

阅读时间: 约 3分钟

记得点个赞支持支持我哦


初步了解

先看下代码,输出结果是多少?

 function fn1 () {
var a = 2
function fn2 () {
console.log(a)
}
}
fn1()


如何产生闭包呢?

当一个嵌套的内部(子)函数引用了嵌套的外部(父)函数的变量(函数)时, 就产生了闭包

那闭包到底是什么呢

理解一: 闭包是嵌套的内部函数(绝大部分人) 
理解二: 包含被引用变量(函数)的对象(极少数人)(倾向于第二种) 
我们可以chrome调试来查看

产生闭包的条件

1.函数嵌套 
2.内部函数引用了外部函数的数据(变量/函数)


常见的闭包

一  将函数作为另一个函数的返回值

 function fn1() {
var a = 2
function fn2() {
a++
console.log(a)
}
return fn2
}
var f = fn1()
f() //
f() //

1.请问该过程产生了几个闭包? 
答: 共产生一个(产生条件是创建内部函数对象就会产生闭包)

2.如果说我想再次产生一个闭包,该怎么做? 
答: 再次创建一个外部函数

二 将函数作为实参传递给另一个函数调用

 function showMsgDelay(msg, time) {
setTimeout(function () {
console.log(msg) //如果将这行去掉就不会产生闭包
}, time)
}
showMsgDelay('zhouMao', 1000)

闭包作用

  1. 使用函数内部的变量在函数执行完后, 仍然存活在内存中(延长了局部变量的生命周期)

  2. 让函数外部可以操作(读写)到函数内部的数据(变量/函数)


思考/总结

 function fn1() {
var a = 2
function fn2() {
a++
console.log(a)
}
function fn3() {
a--
console.log(a)
}
return fn3
}
var f = fn1()
f() //
f() //
  1. 函数执行完后, 函数内部声明的 局部变量(  var a )是否还存在? 
    答: 存在,因为它在闭包中,只有存在于闭包中的变量才
    可能存在

  2. fn2 是否存在 

    答: 不存在,因为没有人引用它,就会变成垃圾对象

  3. 那 
    fn3 呢,是否存在? 

    答: 存在,是因为 
    var f = fn1() 导致的( 闭包没有消失的根本原因 ),当我 
    return fn3() 的时候,保存的是 
    fn3, 一旦返回后,fn3 不存在,但是fn3 不存在不代表函数对象变成垃圾对象,因为 
    var f = fn1() f 指向的是 fn3

  4. 在函数外部能直接访问函数内部的局部变量吗?

    答案但是不能了,但是我们可以通过
    闭包 这个技术让外部操作它

希望大家多多支持我哦

  孔子东游记           公众号:  昼猫笔记

昼猫笔记

昼猫笔记 JavaScript -- 闭包的更多相关文章

  1. 昼猫笔记 JavaScript -- 作用域技巧!!

    简单理解 var zm = function (x) { var code = 'bb' return code }; 学过js的老哥们都知道,当这样简单的一个函数进入浏览器,浏览器开始解释代码,会将 ...

  2. 昼猫笔记 JavaScript -- 异步执行 | 定时器真的定时执行?

      本篇主要内容:异步.定时器引发的思考 预计阅读时间:8分钟 了解 我们都知道在js中定时器有两种  setInterval()  . setTimeout()   setInterval() :按 ...

  3. 昼猫笔记 JavaScript -- 面向对象(I)

    本文内容搬运自公众号 原文链接 本文主要内容:面向对象 预计阅读时间:6分钟 面向对象的方式 单例模式(字面量定义) var obj = {} 类的实例 var obj = new Object() ...

  4. 昼猫笔记 从此告别复杂代码--JavaScript

    昼猫笔记--给你带来不一样的笔记 不止是笔记 更多的是思考 大家好,我是一只来自喵星的前端初学者,由于我们喵星人科技较为落后,昼猫从今天开始带着使命来到地球学习前端知识. 从今天开始,猫猫我就从Jav ...

  5. 昼猫笔记 -- 面向对象(II) - 继承

    继承 由于js不像java那样是真正面向对象的语言,js是基于对象的,它没有类的概念. 所以,要想实现继承,可以用js的原型prototype机制或者用apply和call方法去实现,还有就是js可以 ...

  6. 昼猫笔记--什么是DOM

    昼猫笔记--给你带来不一样的笔记 不止是笔记 更多的是思考 Hello,大家好,昼猫,今天来加深下DOM 什么DOM呢?它的全称叫 Document Object Model 通过全称可以知道它是 文 ...

  7. [读书笔记]JavaScript 闭包(Closures)

    1. 什么是闭包? 参考MDN. 2. 闭包的使用示例 2.1 示例1 <div>1</div> <div>2</div> <div>3&l ...

  8. JavaScript闭包学习笔记

    此文都是大牛们关于闭包的观点,在此只是总结. 闭包应用的两种情况即可——函数作为返回值,函数作为参数传递. 1 深入理解javascript原型和闭包 判断一个变量是不是对象非常简单.值类型的类型判断 ...

  9. ife task0003学习笔记(三):JavaScript闭包

    一.this易错分析 在学习闭包的时候,有一个概念this很重要,关于this的理解,下面3种情况:this指向谁? fn.call(obj1); obj2.fn() fn() 答案是obj1 obj ...

随机推荐

  1. phpstorm 激活方法

    1.本地破解激活(推荐) 下载JetbrainsCrack-2.5.6.jar 链接: http://pan.baidu.com/s/1miPpE2k 密码: w3yc 放到phpstorm安装目录下 ...

  2. [React] React.PureComponent

    React.PureComponent is similar to React.Component. The difference between them is that React.Compone ...

  3. uva 10474 Where is the Marble?(简单题)

    我非常奇怪为什么要把它归类到回溯上,明明就是简单排序,查找就OK了.wa了两次,我还非常不解的怀疑了为什么会 wa,原来是我居然把要找的数字也排序了,当时仅仅是想着能快一点查找.所以就给他排序了,没考 ...

  4. 8、java高级面向对象-重载、构造器重载、初始化块、this、super、对象构造和初始化分析、覆盖、toString

    1.方法的重载(overload) 同一个类中同时存在一个以上的同名函数,参数个数或类型不同或顺序不同,称为方法的重载. 和返回值无关! 构造器重载:非默认构造器和默认构造器其实就是方法的重载. 2. ...

  5. java关键字之transient

    转自:http://www.cnblogs.com/lanxuezaipiao/p/3369962.html 1. transient的作用及使用方法 我们都知道一个对象只要实现了Serilizabl ...

  6. HBase框架基础(一)

    * HBase框架基础(一) 官方网址:http://hbase.apache.org/ * HBase是什么妖怪? 要解释HBase,我们就先说一说经常接触到的RDBMS,即关系型数据库: ** m ...

  7. CheckException和RuntimeException

    java文档中对RuntimeException的定义是: RuntimeException 是那些可能在 Java 虚拟机正常运行期间抛出的异常的超类. 可能在执行方法期间抛出但未被捕获的 Runt ...

  8. 在 yii2.0 框架中封装导出html 表格样式 Excel 类

    在 vendor/yiisoft/yii2/helpers/ 创建一个 Excel.php <?php namespace yii\helpers;   class Excel{         ...

  9. nginx配置虚拟域名

           /usr/lcoal/nginx/conf/nginx.conf 配置详解如下: worker_processes   1;                                ...

  10. HTML标签和文档结构

    HTML标签与文档结构 HTML作为一门标记语言,是通过各种各样的标签来标记网页内容的.我们学习HTML主要就是学习的HTML标签. 那什么是标签呢? #1.在HTML中规定标签使用英文的的尖括号即` ...