说一说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中的闭包
闭包 我的理解是 能够有权访问另一个函数作用域中变量的函数 通常我们知道 普通的函数在调用完成之后,活动对象不会从内存中销毁,其执行环境的作用域链会被销毁,造成资源的浪费 而闭包的好处就在于执行完就会 ...
随机推荐
- 如何搜索 git 提交记录
如何搜索 git 提交记录 git log -p --all -G '可通过正则搜索' --pretty=format:'%ci' # 可跨分支搜索 # -S '通过文本搜索' git branch ...
- _spellmod_aura_pct_on_stat
为玩家添加属性转换光环 `comment` 备注 `aura`光环ID `auraType1` 选择添加('治疗效果','法术强度','近战攻击强度','远程攻击强度','空') `statType ...
- Windows 下Jenkins进程误删,如何重启
手残误删了Jenkins运行的java进程,结果.... 用管理员身份启动cmd 然后进入jenkins目录.运行 net start jenkins 否则会报系统错误5 延伸: net stop j ...
- python常见报错类型
更新ing 报错类型 报错内容 错误判断 错误解决方式 IndentationError IndentationError:unexpected indent 格式错误:以外缩进 Indenta ...
- python kline
# -*- coding: utf-8 -*- # Qt相关和十字光标 from qtpy.QtGui import * from qtpy.QtCore import * from qtpy imp ...
- docker使用笔记
项目部署时用到了docker,以下分享了我在实践中使用的指令,和对docker一些个人的理解(※和字体加重部分) 本文选择使用网易的镜像源:https://c.163.com/hub#/m/home/ ...
- Redis发布订阅方法
进入redis中 docker run -it redis:latest redis-cli -h 192.168.28.56 (本机的ip地址) 以下实例演示了发布订阅是如何工作的.在我们实例中我们 ...
- mui底部选项卡切换实现
MUI提供了两种webview和div模式,来实现底部选项卡切换 效果相同,div是在同一个页面实现所有切换块的页面,根据id导航,而webview是由多个页面组成,形成页面之间的来回跳转
- MySQL数据库(2)
上一篇我们讲述过MySQL创建数据库,数据表的内容,其中涉及到了几个约束: NOT NULL 非空约束 PRIMARY KEY 主键约束 UNIQUE KEY 唯一约束 其实还有两个约束 ...
- idea 本地tomcat启动控制台乱码问题
问题:本地tomcat启动,控制台出现中文乱码: 解决办法: 安装了idea发现启动tomcat的时候控制台会有乱码问题,在tomcat配置中添加在VM options填写-Dfile.encodin ...