本次主要内容是 闭包

阅读时间: 约 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. Qt 学习之路问题

    Qt5 cannot include the file QMainWindow add "greaterThan(QT_MAJOR_VERSION, 4): QT += widgets&qu ...

  2. HDU 5319

    Painter Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Su ...

  3. 数位DP CF388D - Fox and Perfect Sets

    题目地址 一个整数perfect集合满足性质:集合中随意两个整数的异或和仍在这个集合中. 求最大数不超过K的perfect集合的个数. 每一个集合都是一个线性的向量空间. .能够通过全然的高斯消元得出 ...

  4. Android新手入门2016(14)--FragmentTabHost实现选项卡和菜单

    本文来自肥宝传说之路,引用必须注明出处! 这章憋了好久.本来想写选项卡的,学到TabHost,TabWidget的,把代码拿过来准备研究的时候,发现竟然在4.0.3版本号被废弃了. 百度一下,发如今后 ...

  5. js html 事件冒泡

    <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...

  6. IPS

    转自:http://www.ithome.com.tw/node/79293 企業中網路環境的防護,通常都是先有防火牆,再搭配IPS.但是,實際上買得起IPS防護的企業有限,這是因為IPS的價格很昂貴 ...

  7. mysql创建新用户时 连接报错 (解决方案把匿名用户删除)

    ERROR (): Access denied for user 'ljcc'@'localhost' (using password: YES) 步骤 创建了mysql的用户 insert mysq ...

  8. Hadoop 框架基础(四)

    ** Hadoop 框架基础(四) 上一节虽然大概了解了一下 mapreduce,徒手抓了海胆,不对,徒手写了 mapreduce 代码,也运行了出来.但是没有做更深入的理解和探讨. 那么…… 本节目 ...

  9. Blink Coordinate Spaces

    Blink Coordinate Spaces Blink Coordinate Spaces Types of Zoom There are two types of zoom in Chromiu ...

  10. 软raid 实验

    RAID0 条带卷 2+ 100% 读写速度快,不容错 RAID1 镜像卷 2 50% 读写速度一般,容错 RAID5 带奇偶校验的条带卷 3+ (n-1)/n 读写速度快,容错,允许坏一块盘 RAI ...