javascript进阶笔记(3)
本篇文章我们来学习和讨论一下js中的闭包。闭包是纯函数式编程的一个特性,因为它们能够大大简化复杂的操作。在js中,闭包的重要性不言而喻!
简单的说,闭包(closure)是 一个函数在创建时 允许 该自身函数 访问并操作 该自身函数之外的变量时 所创建的作用域。换句话说,闭包可以让函数访问所有的变量和函数,只要这些变量和函数存在于该函数声明时的作用域内就行。要记住,声明的函数在后续什么时候都可以被调用,即便声明时的作用域消失之后。我们通过下面一小段代码来开始本次学习:
var outerValue="outer";
function outerFunction(){
//调用函数外部变量outerValue
alert(outerValue);
}
//执行outerFunction函数
outerFunction();
我们在同一个作用域内声明一个变量outerValue和函数outerFunction(),可以看见,outerFunction()函数能够访问并操作outerValue变量,这样的代码,我们已经写了无数次,但是却没有意识到其实这正在创建一个闭包。这并不奇怪,因为变量outerValue和函数outerFunction()都是在全局作用域内声明的,该作用域(实际上就是一个闭包)从未消失过(因为页面已经被加载了),不足为奇,该函数outerFunction()可以访问到外部变量outerValue,因为它仍在作用域内并且是可用的。只不过,在这种情况下,即便闭包存在,也不清楚它的好处。
接下来,我们再次演变一下代码:
var outerValue="outer";
var later; function outerFunction(){
var innerValue="inner"; function innerFunction(){
//调用外部函数的innerValue变量
alert(innerValue); //调用外部函数的afterValue变量
alert(afterValue);
}
var afterValue="after"; //将innerFunction函数引用到later
later=innerFunction;
}
//执行outerFunction函数
outerFunction();
//执行innerFunction函数
later(); //inner
//after
当outerFunction()函数执行之后,outerFunction()函数的作用域已经消失了。按照函数的作用域来说,通常,此时的innerValue和afterValue变量已不存在了。但是上面的代码真的是这样执行的吗?当然不是!在outerFunction()函数执行之后,我们将内部函数innerFunction的引用赋值给全局变量later来进行调用。此时,later变量引用的innerFunction函数是可用调用到innerValue和afterValue变量的。为什么?因为闭包!
在外部函数outerFunction中声明内部函数innerFunction的时候,不仅仅是声明了innerFunction函数,还创建了一个闭包,该闭包不仅包含函数声明,还包含了内部函数innerFunction声明的那一时刻点上,外部函数作用域中的所有变量。最终当innierFunction函数执行的时候,外部函数outerFunction的作用域已经消失了,通过闭包,innerFunction函数还是可以访问到原始作用域的。
通过以上代码可以看出:
1、内部函数的参数是包含在闭包中的;
2、内部函数作用域之外的所有变量,即便是函数声明之后的那些声明,也都包含在闭包中。
第二点可以解释为什么当外部函数outerFunction的作用域消失之后,内部函数innerFunction还是可以访问innerValue和afterValue变量。
javascript进阶笔记(3)的更多相关文章
- javascript进阶笔记(2)
js是一门函数式语言,因为js的强大威力依赖于是否将其作为函数式语言进行使用.在js中,我们通常要大量使用函数式编程风格.函数式编程专注于:少而精.通常无副作用.将函数作为程序代码的基础构件块. 在函 ...
- javascript进阶笔记(1)
学习js已经有一段时间了,大大小小还是能够做出一些东西来.不过觉得可惜的是,还是对js本身这门语言不是很熟悉,总有一点雾里看花的感觉,看得见,但是看不清楚.最近发现有一本关于js的叫做<忍者秘籍 ...
- #笔记#JavaScript进阶篇一
#JavaScript进阶篇 http://www.imooc.com/learn/10 #认识DOM #window对象 浏览器窗口可视区域监测—— 在不同浏览器(PC)都实用的 JavaScrip ...
- JavaScript学习笔记 - 进阶篇(1)- JS基础语法
前言 JavaScript能做什么? 1.增强页面动态效果(如:下拉菜单.图片轮播.信息滚动等) 2.实现页面与用户之间的实时.动态交互(如:用户注册.登陆验证等) JS进阶篇学习什么? 在JavaS ...
- JavaScript进阶--慕课网学习笔记
JAVASCRIPT—进阶篇 给变量取个名字(变量命名) 变量名字可以任意取,只不过取名字要遵循一些规则: 1.必须以字母.下划线或美元符号开头,后面可以跟字 ...
- 4、JavaScript进阶篇①——基础语法
一.认识JS 你知道吗,Web前端开发师需要掌握什么技术?也许你已经了解HTML标记(也称为结构),知道了CSS样式(也称为表示),会使用HTML+CSS创建一个漂亮的页面,但这还不够,它只是静态页面 ...
- JavaScript基础笔记二
一.函数返回值1.什么是函数返回值 函数的执行结果2. 可以没有return // 没有return或者return后面为空则会返回undefined3.一个函数应该只返回一种类型的值 二.可变 ...
- JavaScript基础笔记一
一.真假判断 真的:true.非零数字.非空字符串.非空对象 假的:false.数字零.空字符串.空对象.undefined 例: if(0){ alert(1) }else{ alert(2) } ...
- Java程序猿的JavaScript学习笔记(汇总文件夹)
最终完结了,历时半个月. 内容包含: JavaScript面向对象特性分析,JavaScript高手必经之路. jQuery源代码级解析. jQuery EasyUI源代码级解析. Java程序猿的J ...
随机推荐
- 完全二叉树的节点个数 Count Complete Tree Nodes
2018-09-25 16:36:25 问题描述: 问题求解: 单纯遍历了一遍,emmm,果然TLE. 解题思路就是比较左边树高度和右边树高度,如果相等,那么就是一个满二叉树,返回1 << ...
- 7内存管理-MRC
@0简介 内存管理,即内存里各个对象的管理,即内存里各个对象的生命周期的管理,(从面向对象的角度看) @1引用计数器 默认为1,即有一滴的生命血液,若为0就会死去 @2单个对象的管理 自己管理自己,自 ...
- Maven报错Please ensure you are using JDK 1.4 or above and not a JRE解决方法!
https://www.cnblogs.com/shihua513/p/6163682.html 在eclipse下用maven编译时,很有可能出现以下错误: Please ensure you ar ...
- uva11552
将字符串分为len/k块.用dp[i][j]表示第i个块必须以j结尾的最小划分.当第i块没有字符j时,dp[i][j]多计一个.如果当前块只有1种字符,那么就等于dp[i-1][j].否则对于第i块的 ...
- C#方式操作Cookie
1.设置cookie public static void SetCookie(string TokenValue) { HttpCookie tokencookie = new HttpCookie ...
- linux中用composer安装yii框架
我的服务器是安装的是lanmp环境 如果环境版本比较低的话,建议升级一下版本 升级版本命令:./lanmp.sh cus 全都选择最高的.完成之后: curl -sS https://getcompo ...
- 关于linux中用vi新建立一个.c文件无法保存,显示E212错误的时候
在ubuntu16.04环境下,用vi新键.c文件,怎么保存也不能 先按ESC 然后: 在后wq 可是显示文件212错误. 后来知道在建立.c的文件夹的权限不对.这里的权限用 ls -l来查看 ...
- leetcode-algorithms-23 Merge k Sorted Lists
leetcode-algorithms-23 Merge k Sorted Lists Merge k sorted linked lists and return it as one sorted ...
- docker 系列之 配置阿里云镜像加速器
1.登录阿里云 2.登录后找到右上角的“管理中心”,点击进入后>点击“镜像加速器”;剩下的安装文档配置就好 问题1:配置完后还是提示:Tag latest not found in reposi ...
- Python的time和datetime
#python中时间日期格式化符号 %y 两位数的年份表示(00-99) %Y 四位数的年份表示(000-9999) %m 月份(01-12) %d 月内中的一天(0-31) %H 24小时制小时数( ...