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.我们可以使用闭包来模拟私有方法。私有方法不仅仅有利于限制对代码的访问:还提供了管理全局命名空间的强大能力,避免非核心的方法弄乱了代码的公共接口部分。通常使用只有一个方法的对象的地方,都可以使用闭包。
。。。未完,后续补充。
最新文章
- Node-Webkit打包
- Dreamweaver 扩展开发: Calling a C++ function from JavaScript
- android控制系统音量
- data abstractions 数据抽象
- JQuery获取和设置Select选项常用方法总结
- Cheatsheet: 2014 09.01 ~ 09.30
- Linux 的进程组、会话、守护进程
- java学习笔记(10) —— ActionContext、ServletActionContext、ServletRequestAware用法
- AVC1与H264的差别
- media_root以及static_root配置
- counting objects in class
- view和activity的区别(转)
- 35W行数据的文本文件,每500行添加4个换行符。代码实现思路
- C#如何连接wifi和指定IP
- ELK安装
- 【Java】运用泽勒一致性计算某天是星期几
- 理解java容器:iterator与collection,容器的起源
- 开源 DotNetty 实现的 Modbus TCP/IP 协议
- pyqt5的安装
- HADOOP nutch java mysql