day06—JavaScript之闭包
转行学开发,代码100天——2018-03-22
第一次听说“闭包”这个词,还是在2015年某个深夜在听一节腾讯课堂的公开课上,当时老师讲什么已经没有清晰的记忆了,只知道是一次web的开发课程。
过了这么久,又把“闭包”学起,可能还不够深刻,记录下来,日后再补充和完善。
闭包——就是能够读取其他函数内部变量的函数。在JavaScript中只有函数内部的子函数才能读取其局部变量。闭包可以说是定义在函数内部的函数,连接了函数内部和外部。
function init() {
var name="allen";
function showName()
{
alert(name);
}
showName();
} init();
程序执行结果输出为:allen
上例中 变量name是函数showName()外的局部变量。showName()是函数init()的一个内部函数,仅在函数体内部使用,也就是本文所说的“闭包”。showName()中使用了父函数中的局部变量name。showName()自身没有变量,但是它可以访问外部变量name。
然而,当showName()函数内部定义同名变量后,程序执行输出该自身变量的值,如:
function init() {
var name="allen";
function showName()
{
name ="july";
alert(name);
}
showName();
} init();
程序执行输出:july
若将函数改为如下:
function init()
{
var name ="allen";
function showName()
{
alert(name); }
return showName; }
var ss = init();
ss();
执行结果与最初一致,即输出:allen。
与之前不同的是showName()函数被init()方法返回。这与一般“函数内部定义的变量,在函数执行完毕后不能再次访问”的认识显然不符。也就是说该段程序中,name变量的值一直在被保留。若上面的这段程序中,直接调用init();则并不会输出任何结果,即表明在内部函数 showName()
在执行前,被外部函数返回。
产生这种现象,有人说是一种bug。某种程度上,比较接受这种方式,不然也不会在此伤脑细胞了解JavaScript的这个“特色”了。既然不可不知,就还是试图理解:
JavaScript中的函数会形成闭包。 闭包是由函数以及创建该函数的词法环境组合而成。这个环境包含了这个闭包创建时所能访问的所有局部变量。
那闭包有什么用呢?
1.我们可以使用闭包来模拟私有方法。私有方法不仅仅有利于限制对代码的访问:还提供了管理全局命名空间的强大能力,避免非核心的方法弄乱了代码的公共接口部分。通常使用只有一个方法的对象的地方,都可以使用闭包。
。。。未完,后续补充。
day06—JavaScript之闭包的更多相关文章
- 深入理解JavaScript的闭包特性如何给循环中的对象添加事件
初学者经常碰到的,即获取HTML元素集合,循环给元素添加事件.在事件响应函数中(event handler)获取对应的索引.但每次获取的都是最后一次循环的索引.原因是初学者并未理解JavaScript ...
- JavaScript作用域闭包简述
JavaScript作用域闭包简述 作用域 技术一般水平有限,有什么错的地方,望大家指正. 作用域就是变量起作用的范围.作用域包括全局作用域,函数作用域以块级作用域,ES6中的let和const可以形 ...
- JavaScript的闭包原理
什么是js(JavaScript)的闭包原理,有什么作用? 一.定义 官方解释:闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分. 个人的理解是 ...
- Js(javaScript)的闭包原理
问题?什么是js(javaScript)的闭包原理,有什么作用? 一.定义 官方解释:闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分. 小编 ...
- 深入理解javascript的闭包
闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. 一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域 ...
- 如何给循环中的对象添加事件--深入理解JavaScript的闭包特性
初学者经常碰到的,即获取HTML元素集合,循环给元素添加事件.在事件响应函数中(event handler)获取对应的索引.但每次获取的都是最后一次循环的索引.原因是初学者并未理解JavaScript ...
- javascript,jquery(闭包概念)(转)
偶尔听人说javascript闭包,让我联想起以前学编译原理和数字逻辑里讲的闭包,以前上课讲的闭包很难懂,而且含有递归的意思在里面,现在不想再查看里面的闭包概念. 但javascript我是经常要用, ...
- 理解Javascript 的闭包(closure)
要理解闭包的概念先从变量的作用域说去 一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域无非就是两种:全局变量和局部变量. Javascript语言的特殊之 ...
- 两个示例介绍JavaScript的闭包
JavaScript的闭包有两个用途:一个是访问函数内部的变量:另一个是让变量的值在作用域内保持不变.函数是JavaScript 中唯一有作用域的对象,因此JavaScript的闭包依赖于函数实现,下 ...
随机推荐
- [Python3 填坑] 003 关键字?保留字?预留字?
目录 1. print( 坑的信息 ) 2. 开始填坑 2.1 问题的由来 2.2 网上搜索 2.3 结论 2.4 后记 1. print( 坑的信息 ) 挖坑时间:2019/01/04 明细 坑的编 ...
- 单片机BootLoader
http://bbs.elecfans.com/jishu_467138_1_1.html 作用:app程序,固件程序升级
- (Git 学习)一个账户怎么创建多个ssh key
(Git 学习)一个账户怎么创建多个ssh key:1.https://segmentfault.com/a/1190000009572470?_ea=1985120 2.https://www.ji ...
- 极*Java速成教程 - (3)
Java语言基础 访问权限控制 Java是一个面向对象的语言,当你不是它所设计的要面向的对象时,它就不会给你看你不该看到的东西,也就是"访问权限控制". 亲疏有别,才能权限控制 包 ...
- poj_1995 Raising Modulo Numbers (快速幂)
[题目链接] http://poj.org/problem?id=1995 [算法] 基本快速幂(二进制思想) 注意两个int相乘可能溢出,加(long long)但是相乘不要加括号,不然会先溢出在类 ...
- python学习第四十四天斐波那契数列和yield关键词使用
斐波那契数列是数学中的常见的算法,第一个第二个不算,从第三个开始,每个数的都是前面两个数的和,使用yield关键词把生成的数列保存起来,调用的时候再调用,下面举例说明一下 def fab(max): ...
- 【推荐系统】知乎live入门5.常用技能与日常工作
参考链接 [推荐系统]知乎live入门 目录 1. 实习与求职 2. 推荐算法职责 3. 解构算法 4. 参考资料 5. 其他强关联岗位 6. 工作模型和日常工作 7. 2017年相关论文 8. 找工 ...
- js实现-小框框全选
点击全选下面单独的肉也会全选,再次点击取消 一个一个点击肉,点完--全选也会被选上 HTML代码---CSS略 <table> <tr> <th> <inpu ...
- java 中Shallow Heap与Retained Heap的区别
Shallow Size Shallow Size是对象本身占据的内存的大小,不包含其引用的对象.对于常规对象(非数组)的Shallow Size由其成员变量的数量和类型来定,而数组的ShallowS ...
- 消灭 Java 代码的“坏味道”
消灭 Java 代码的“坏味道” 原创: 王超 阿里巴巴中间件 昨天 导读 明代王阳明先生在<传习录>谈为学之道时说: 私欲日生,如地上尘,一日不扫,便又有一层.着实用功,便见道无终穷,愈 ...