说一说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中的闭包
闭包 我的理解是 能够有权访问另一个函数作用域中变量的函数 通常我们知道 普通的函数在调用完成之后,活动对象不会从内存中销毁,其执行环境的作用域链会被销毁,造成资源的浪费 而闭包的好处就在于执行完就会 ...
随机推荐
- Latex 经常见到的问题和解决方法
Latex 经常见到的问题和解决方法 2017-04-10 22:05:48 [资源下载]Texlive 2018 下载地址:http://mirror.lzu.edu.cn/CTAN/system ...
- Java解析XML文件的常用方法介绍
XML是一个可扩展标记语言.很多时候我们需要进行数据交换,同时也存在跨平台使用,XML文件对这些需求提供了很好的帮助! 对于Java来说,XML常见的用途就是保存数据和配置,这就涉及了对XML文件的增 ...
- java基础学习之"堆" "栈" "静态存储区" "方法区"
引用部分 java中堆栈(stack)和堆(heap)(还在问静态变量放哪里,局部变量放哪里,静态区在哪里.....进来) Java堆.栈和常量池以及相关String的讲解 等我看完"深入理 ...
- 阿里云Hadoop集群DataNode连接不上NameNode
在logs日志中可以看见DataNode多次去连NameNode,但是都失败了. 经过长时间的研究百度,终于知道了原因. 原因就是安全组限制了端口的开放,所以我们只要把相应的端口打开即可.
- mac 开启ntfs 权限
原文: https://zhuanlan.zhihu.com/p/29542892 参考: https://bbs.feng.com/read-htm-tid-9932031.html 其实最早在OS ...
- visual studio常用技法相关
(1)查看dll里面包含了那些函数(dumpbin是visual studio内置工具)dumpbin -exports user32.lib (2)#include "stdlib.h&q ...
- suse源
zypper addrepo -f http://mirrors.vbi.vt.edu/mirrors/linux/opensuse/discontinued/distribution/11.4/re ...
- PowerDesigner设置Oracle不区分大小写
一. powerdesigner设置当前数据库 打开powerdesigner,然后选择菜单DatabaseChange current DBMS,如图: 修改这个下拉框的值即可. 二. power ...
- Python 入门小实例笔记
实例1:打印用户输入的姓名与手机号码知识点:编码,获取输入,变量,标准输出 #encoding=utf-8 import time #1.提示用户输入信息 name = input ("请输 ...
- python webdriver api-对启动的火狐浏览器添加配置
Webdriver启用的火狐不带插件,可以自已进行配置 先找到火狐的安装路径 C:\Program Files\Mozilla Firefox 步骤说明 在CMD中使用cd命令进入firefox.ex ...