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语言中只有在函数 ...
随机推荐
- LA 2995 立方体成像(模拟)
题目链接:https://vjudge.net/problem/UVALive-2995 这道题的主要难点在于三维坐标系的建立,然后在坐标系中进行迭代更新. 注意用宏定义来简化代码. AC代码: #i ...
- C# Socket通信DEMO
一.套接字(socket)概念 套接字(socket)是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元.它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息:连接使用的协议,本 ...
- 2019,.Net开发者的高光时刻
随着微软发布的一系列关于Windows..net和C#的公告,.Net开发者将在2019年,迎来自己的高光时刻,毕竟“世界上只有少数几种语言是多功能的,而没有一个像C#那样干净整洁.” 一.现在学C# ...
- 在elementui表单中实现对vue-quill-editor富文本编辑器内容的绑定
1.v-model(表单标签双向绑定指令) v-model相当于:value=""和@input=""的结合 代码1: <input type=" ...
- Python开发五子棋游戏【新手必学】
五子棋源码,原创代码,仅供 python 开源项目学习.目前电脑走法笨笨的,下一期版本会提高电脑算法ps:另外很多人在学习Python的过程中,往往因为遇问题解决不了或者没好的教程从而导致自己放弃,为 ...
- Plastic Bottle Manufacturer Tips: Use Caution For Plastic Bottles
Plastic bottles use polyester (PET), polyethylene (PE), polypropylene (PP) as raw materials, after a ...
- as(android studio)的初次使用
链接:https://blog.csdn.net/qq_28808627/article/details/50058805
- 克隆虚拟机后ip配置
(1)出错原因: 错误:No suitable device found: no device found for connection "System eth0" 原因:克隆虚拟 ...
- 【PAT甲级】1069 The Black Hole of Numbers (20 分)
题意: 输入一个四位的正整数N,输出每位数字降序排序后的四位数字减去升序排序后的四位数字等于的四位数字,如果数字全部相同或者结果为6174(黑洞循环数字)则停止. trick: 这道题一反常态的输入的 ...
- 「SDOI2009」虔诚的墓主人
传送门 Luogu 解题思路 离散化没什么好说 有一种暴力的想法就是枚举每一个坟墓,用一些数据结构维护一下这个店向左,向右,向上,向下的常青树的个数,然后用组合数统计方案. 但是网格图边长就有 \(1 ...