JS闭包(1)
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)的更多相关文章
- js闭包的作用域以及闭包案列的介绍:
转载▼ 标签: it js闭包的作用域以及闭包案列的介绍: 首先我们根据前面的介绍来分析js闭包有什么作用,他会给我们编程带来什么好处? 闭包是为了更方便我们在处理js函数的时候会遇到以下的几 ...
- 大部分人都会做错的经典JS闭包面试题
由工作中演变而来的面试题 这是一个我工作当中的遇到的一个问题,似乎很有趣,就当做了一道题去面试,发现几乎没人能全部答对并说出原因,遂拿出来聊一聊吧. 先看题目代码: function fun(n,o) ...
- Js闭包常见三种用法
Js闭包特性源于内部函数可以将外部函数的活动对象保存在自己的作用域链上,所以使内部函数的可以将外部函数的活动对象占为己有,可以在外部函数销毁时依然存有外部函数内的活动对象内容,这样做的好处是可 ...
- js闭包之初步理解( JavaScript closure)
闭包一直是js中一个比较难于理解的东西,而平时用途又非常多,因此不得不对闭包进行必要的理解,现在来说说我对js闭包的理解. 要理解闭包,肯定是要先了解js的一个重要特性, 回想一下,那就是函数作用域, ...
- (原创)JS闭包看代码理解
<html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="C ...
- js闭包理解
js闭包的作用是使函数外可以访问函数内部的变量,是通过 在函数内部 定义 访问函数内变量 的函数实现的,内部的一个函数产生一个闭包 function a() { var i=0; return fun ...
- js闭包理解实例小结
Js闭包 闭包前要了解的知识 1. 函数作用域 (1).Js语言特殊之处在于函数内部可以直接读取全局变量 <script type="text/javascript"> ...
- Js闭包的用途
本来想总结一点JavaScript中的闭包的一些用法,在查资料的时候发现了一篇很好的文章,就转过来收藏了,下面附上传送门: js闭包的用途 ---------sunlylorn 我们来看看闭包的用途. ...
- js闭包和ie内存泄露原理
也议 js闭包和ie内存泄露原理 可以, 但小心使用. 闭包也许是 JS 中最有用的特性了. 有一份比较好的介绍闭包原理的文档. 有一点需要牢记, 闭包保留了一个指向它封闭作用域的指针, 所以, 在给 ...
- js闭包(closure),个人理解
一.闭包概念理解 各种专业文献上对js"闭包"(closure)定义非常抽象,贼难看懂.我的理解是,闭包就是能够读取某函数内部变量的函数.由于在Javascript语言中只有在函数 ...
随机推荐
- Reinforcement Learning Algorithm 资源
算法源码: https://github.com/ljpzzz/machinelearning https://github.com/imraviagrawal/Reinforcement-Learn ...
- 插入数据:insert,replace
*insert高级用法* 1.语法:insert into tbname(字段列表) values 值列表; 1.1可以不将所有的字段都插入数据.如果说需要完成部分字段的插入,需要必须存在字段列表. ...
- C#面向对象三大特性:继承
什么是继承 定义:继承是面向对象编程语言中的一个重要特性,当一个类A能够获取另一个类B中所有非私有的数据和操作的定义作为自己的部分或全部成分时,就称这两个类之间具有继承关系.被继承的类B称为父类或基类 ...
- JAVA基础学习(7)之函数
7函数 7.1函数定义与调用 7.1.1函数定义 7.1.2函数调用 package com.study.main; public class ObjectStudy { public static ...
- springboot 服务卡死 连接池查询无响应问题解决
排查背景:基于nacos + springboot + druid +mybatis + mysql的环境,服务突然就出现不可访问,所有连接都超时,重启就可以使用一会,过一会就又不可用了 排查出来的原 ...
- lambda表达式在解决java后台分组排序时的应用
需求:按照起始日期查询出数据库里一段连续日期的住院信息. 问题:数据库里的住院信息可能不是完整的,也就是在给出的日期区间里只有若干天的数据,缺少某些日期的数据. 解决: 1.需要我们先按日期分组查出数 ...
- 《JavaScript高级程序设计》读书笔记(三)基本概念第二小节 Number类型
内容---语法 上一小节---数据类型 本小节 number类型---流程控制语句---理解函数 number类型--使用IEEE754格式来表示整数和浮点数值(双精度数值)--规定了数值字面量格式, ...
- java 协程
协程是比线程更轻量级的程序处理单元,也可以说是运行在线程上的线程,由自己控制 1.适用于被阻塞的,且需要大量并发的场景. 2.不适用于,大量计算的多线程,遇到此种情况,更好实用线程去解决. 虽然Jav ...
- MySQL 将字符串转换为数字
转载自:https://www.cnblogs.com/xiaoleiel/p/8316508.html 在操作mysql时,经常需要将字符转换成数字,这一步虽然简单,但不常用的话也很容易忘记,现将在 ...
- Qt5基于smtp服务发送电子邮件
1.设置邮箱 先登录163邮箱,然后在邮箱界面找到设置,在里面开通smtp服务. 这一步比较关键,要开通smtp服务,在开通的过程中会让你输入一个邮箱客户端授权码,这个才是你后面要用到的密码,而不是你 ...