说一说js中的闭包
不说官方给的定义,感觉自己刚开始看也不是很理解。
闭包 : 其实就是 该函数能使用函数外定义的变量。
为什么要使用闭包?
首先来说一下局部变量和全局变量的危害: 全局变量容易全局污染,局部变量又无法共享,不能长久保存
那闭包实现了一个什么?
既可以共享,长久保存,又不会全局污染,其实是用来保护局部变量的。
闭包有什么缺点?
占内存,至于为什么占内存,稍后会画内存图来说明。
如果说你要写一个闭包,就是抓住闭包的三个特点:
- 定义外层函数,封装被保护的局部变量
- 定义内层函数,执行对局部变量(外层函数的)的操作
- 外层函数返回内层函数的对象,并且外层函数被调用,结果保存在全局变量中
function outer(){
var n = 1;
function inner(){
return n++;
}
return inner;
}
var getNum = outer();
所以说在你判断闭包的时候一般是看以下三点:
- 嵌套函数
- 内层函数一定操作了外层函数的局部变量
- 外层函数将内层函数返回到外部,被全局变量保存住
那一个闭包我们又如何去判断他的执行结果呢?
- 外层函数被调用了几次,就有几个受保护的局部变量副本
- 来自一个闭包的函数被调用几次,受保护的局部变量就变化几次
比如刚刚那个例子来说:
function outer(){
var n = 1;
function inner(){
return n++;
}
return inner;
}
var getNum = outer();
//外层函数调用一次,有一个被保护的n
console.log(getNum());
//
console.log(getNum());
//
var getNum2 = outer();
//外层函数被调用两次,有两个互不干扰的n
console.log(getNum2());
//
内存图:
创建函数的同时会创建两个对象:
函数对象:函数的定义 (老板)
作用域链对象:保存了函数对象可用的变量的位置的对象(栈),默认第一项指向window(管理员)
而调用函数时,又会创建一个新对象
活动对象:专门保存局部变量的对象(这里说一下函数中的局部变量指的是 参数 和 var声明的)
在作用域链对象中追加指向活动对象的引用
调用后:仅仅释放了活动对象,作用域链中活动对象的引用出栈,活动对象因无人引用而释放
(也就是说内存图中,某一块当没有人指入它时,就会被释放)

除去释放后的部分:

可见如果有闭包的存在,其实是很占内存的,它会形成这种循环的指入,使得无法被释放
说一说js中的闭包的更多相关文章
- 详解js中的闭包
前言 在js中,闭包是一个很重要又相当不容易完全理解的要点,网上关于讲解闭包的文章非常多,但是并不是非常容易读懂,在这里以<javascript高级程序设计>里面的理论为基础.用拆分的方式 ...
- js中的闭包之我理解
闭包是一个比较抽象的概念,尤其是对js新手来说.书上的解释实在是比较晦涩,对我来说也是一样. 但是他也是js能力提升中无法绕过的一环,几乎每次面试必问的问题,因为在回答的时候.你的答案的深度,对术语的 ...
- 浅谈JS中的闭包
浅谈JS中的闭包 在介绍闭包之前,我先介绍点JS的基础知识,下面的基础知识会充分的帮助你理解闭包.那么接下来先看下变量的作用域. 变量的作用域 变量共有两种,一种为全局变量,一种为局部变量.那么全局变 ...
- js中的“闭包”
js中的“闭包” 姓名:闭包 官方概念:闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分. ( ⊙o⊙ )!!!这个也太尼玛官方了撒,作为菜鸟的 ...
- JS中的闭包(closure)
JS中的闭包(closure) 闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现.下面就是我的学习笔记,对于Javascript初学者应该是很有用 ...
- Js中的闭包原理
要了解清楚js中的闭包制机,那么得先了解全局执行环境.块级执行环境.函数执行环境.变量对象.环境栈.作用域链.摧毁执行环境. 全局执行环境 全局执行环境指的是最外层的执行环境.在web中全局执行环境被 ...
- js中的闭包理解一
闭包是一个比较抽象的概念,尤其是对js新手来说.书上的解释实在是比较晦涩,对我来说也是一样. 但是他也是js能力提升中无法绕过的一环,几乎每次面试必问的问题,因为在回答的时候.你的答案的深度,对术语的 ...
- js中的闭包理解
闭包是一个比较抽象的概念,尤其是对js新手来说.书上的解释实在是比较晦涩,对我来说也是一样. 但是他也是js能力提升中无法绕过的一环,几乎每次面试必问的问题,因为在回答的时候.你的答案的深度,对术语的 ...
- 初识js中的闭包
今天看了关于js闭包方面的文章,还是有些云里雾里,对于一个菜鸟来说,学习闭包确实有一定的难度,不说别的,能够在网上找到一篇优秀的是那样的不易. 当然之所以闭包难理解,个人觉得是基础知识掌握的不牢,因为 ...
- 理解js中的闭包
闭包 我的理解是 能够有权访问另一个函数作用域中变量的函数 通常我们知道 普通的函数在调用完成之后,活动对象不会从内存中销毁,其执行环境的作用域链会被销毁,造成资源的浪费 而闭包的好处就在于执行完就会 ...
随机推荐
- Android Studio3.1.2运行模拟器出错Emulator:emulator:ERROR:x86 emulation currently requires hardware acceleration!
出错截图如下所示: 解决方法: 由于我是已经解决了这个问题,安装了Intel x86 Emulator Accelerator,所以显示后面显示的是 Installed,如果报错和我贴的图一样,就可以 ...
- mybatis-ehcache整合中出现的异常 ibatis处理器异常(executor.ExecutorException)解决方法
今天学习mabatis时出现了,ibatis处理器处理器异常,显示原因是Executor was closed.则很有可能是ibatis的session被关闭了, 后面看了一下测试程序其实是把sqlS ...
- 排查OPENSTACK浮动IP被占用记录
在openstack上新建机器时,发现用户无法登陆. 检查该机器的22端口,返回 Connection refused. ping该IP,发现可以ping通. 释放该浮动ip,然后去ping该 ...
- Java问题解决:"错误:编码GBK 的不可映射字符"
参考资料:http://blog.csdn.net/l1028386804/article/details/46583279 场景: 在使用javac编译java文件时出现以下错误: 解决方法: 使用 ...
- 谈谈传统BIO网络编程模型的局限性与NIO
先来看看我们的server端: 创建一个serversocket,进行监听,每来一个客户端,就启动一个新启动为其服务: private void createListenSocket() { //如果 ...
- Oracle之数组
记忆力不好,提供样例套路: 固定长度数组: declare type t_test ) ); test t_test := t_test('a', 'b', 'c', 'd', 'e'); begin ...
- linux debug tools
linux modules: IO schedule.VFS.OOM.memory.net.process schedule kernel debug: perf(IO bound\CPU bound ...
- python 数据分类赋值
问题描述:在数据预处理时,往往需要对描述性数据进行分类赋值或对数据进行分级赋值. 首先,会想到用for循环,依次判断赋值: for n in range(len(data1)): print(n) i ...
- SpringBoot整合Mybatis注解版---update出现org.apache.ibatis.binding.BindingException: Parameter 'XXX' not found. Available parameters are [arg1, arg0, param1, param2]
SpringBoot整合Mybatis注解版---update时出现的问题 问题描述: 1.sql建表语句 DROP TABLE IF EXISTS `department`; CREATE TABL ...
- 解决:SSM框架中普通类调用Service的问题 (转)
http://blog.csdn.net/gwd1154978352/article/details/73480959