昼猫笔记 JavaScript -- 闭包
本次主要内容是 闭包
阅读时间: 约 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)
闭包作用
使用函数内部的变量在函数执行完后, 仍然存活在内存中(延长了局部变量的生命周期)
让函数外部可以操作(读写)到函数内部的数据(变量/函数)
思考/总结
function fn1() {
var a = 2
function fn2() {
a++
console.log(a)
}
function fn3() {
a--
console.log(a)
}
return fn3
}
var f = fn1()
f() //
f() //
函数执行完后, 函数内部声明的 局部变量(
var a)是否还存在?
答: 存在,因为它在闭包中,只有存在于闭包中的变量才
可能存在
fn2是否存在
答: 不存在,因为没有人引用它,就会变成垃圾对象那
fn3呢,是否存在?
答: 存在,是因为
var f = fn1()导致的( 闭包没有消失的根本原因 ),当我
return fn3()的时候,保存的是
fn3, 一旦返回后,fn3 不存在,但是fn3 不存在不代表函数对象变成垃圾对象,因为
var f = fn1()f 指向的是 fn3在函数外部能直接访问函数内部的局部变量吗?
答案但是不能了,但是我们可以通过
闭包 这个技术让外部操作它
希望大家多多支持我哦
孔子东游记 公众号: 昼猫笔记
昼猫笔记
昼猫笔记 JavaScript -- 闭包的更多相关文章
- 昼猫笔记 JavaScript -- 作用域技巧!!
简单理解 var zm = function (x) { var code = 'bb' return code }; 学过js的老哥们都知道,当这样简单的一个函数进入浏览器,浏览器开始解释代码,会将 ...
- 昼猫笔记 JavaScript -- 异步执行 | 定时器真的定时执行?
本篇主要内容:异步.定时器引发的思考 预计阅读时间:8分钟 了解 我们都知道在js中定时器有两种 setInterval() . setTimeout() setInterval() :按 ...
- 昼猫笔记 JavaScript -- 面向对象(I)
本文内容搬运自公众号 原文链接 本文主要内容:面向对象 预计阅读时间:6分钟 面向对象的方式 单例模式(字面量定义) var obj = {} 类的实例 var obj = new Object() ...
- 昼猫笔记 从此告别复杂代码--JavaScript
昼猫笔记--给你带来不一样的笔记 不止是笔记 更多的是思考 大家好,我是一只来自喵星的前端初学者,由于我们喵星人科技较为落后,昼猫从今天开始带着使命来到地球学习前端知识. 从今天开始,猫猫我就从Jav ...
- 昼猫笔记 -- 面向对象(II) - 继承
继承 由于js不像java那样是真正面向对象的语言,js是基于对象的,它没有类的概念. 所以,要想实现继承,可以用js的原型prototype机制或者用apply和call方法去实现,还有就是js可以 ...
- 昼猫笔记--什么是DOM
昼猫笔记--给你带来不一样的笔记 不止是笔记 更多的是思考 Hello,大家好,昼猫,今天来加深下DOM 什么DOM呢?它的全称叫 Document Object Model 通过全称可以知道它是 文 ...
- [读书笔记]JavaScript 闭包(Closures)
1. 什么是闭包? 参考MDN. 2. 闭包的使用示例 2.1 示例1 <div>1</div> <div>2</div> <div>3&l ...
- JavaScript闭包学习笔记
此文都是大牛们关于闭包的观点,在此只是总结. 闭包应用的两种情况即可——函数作为返回值,函数作为参数传递. 1 深入理解javascript原型和闭包 判断一个变量是不是对象非常简单.值类型的类型判断 ...
- ife task0003学习笔记(三):JavaScript闭包
一.this易错分析 在学习闭包的时候,有一个概念this很重要,关于this的理解,下面3种情况:this指向谁? fn.call(obj1); obj2.fn() fn() 答案是obj1 obj ...
随机推荐
- hadoop-16-sqoop导入oracle数据
sqoop = sql + hadoop 1,系统方面的准备 scp ./ojdbc6.jar root@server-1:/usr/hdp/2.6.0.3-8/sqoop/lib/scp ./ojd ...
- reverse(两种反向生成url django原生形式和rest_framework中版本的形式)
reverse(两种反向生成url django原生形式和rest_framework中版本的形式) views.py from django.shortcuts import render,Http ...
- [codeforces 618 F] Double Knapsack (抽屉原理)
题目链接:http://codeforces.com/contest/618/problem/F 题目: 题目大意: 有两个大小为 N 的可重集 A, B, 每个元素都在 1 到 N 之间. 分别找出 ...
- vue组件的一些知识理解
组件我们在项目中会很常用到,说下自己在学习过程中的理解,有关 组件初始化顺序,组件为什么data是function,组件的生命周期 1. Vue.component('', {}) 注册全局组件,组 ...
- leetcode 新题型----SQL,shell,system design
leetcode 主要是一个针对北美的coder人群找工作的代码练习网站,我在2015年初次接触这个网站的时候,总共只有200多道题目,是一个类似acm 的a题网站.这些年变化越来越大,主要是因为找工 ...
- jQuery新浪微博表情插件教程
1.引入css文件 <link rel="stylesheet" type="text/css" href="jquery.sinaEmotio ...
- <Three.js>(第一节)环境搭建
Three.js顾名思义3D的js库.是运行在浏览器的基于webgl的3D引擎.该引擎是github上的一个开源项目,下载地址:https://github.com/mrdoob/three.js/ ...
- Bayes++ Library入门学习之熟悉class-Bayesian_filter_base(1)
在对Bayes++库的名称空间有了一个大概的了解之后,我们开始学习该名称空间下的第一个子类Bayesian_filter::Bayes_filter_base. 该类与其子类的继承关系图如下图所示. ...
- appium使用教程(三)-------------用例编写
1. 驱动 import os, time, unittest from appium import webdriver PATH = lambda p:os.path.abspath(os.path ...
- 今日SGU 5.27
SGU 122 题意:给你n个人,每个人有大于 N / 2(向上取整)的朋友,问你1这个人有一个书,每个人都想看,只能从朋友之间传递,然后最后回到了1这个人,问你 是否有解,然后有解输出路径 收获:哈 ...