转行学开发,代码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.我们可以使用闭包来模拟私有方法。私有方法不仅仅有利于限制对代码的访问:还提供了管理全局命名空间的强大能力,避免非核心的方法弄乱了代码的公共接口部分。通常使用只有一个方法的对象的地方,都可以使用闭包。

。。。未完,后续补充。

最新文章

  1. Node-Webkit打包
  2. Dreamweaver 扩展开发: Calling a C++ function from JavaScript
  3. android控制系统音量
  4. data abstractions 数据抽象
  5. JQuery获取和设置Select选项常用方法总结
  6. Cheatsheet: 2014 09.01 ~ 09.30
  7. Linux 的进程组、会话、守护进程
  8. java学习笔记(10) —— ActionContext、ServletActionContext、ServletRequestAware用法
  9. AVC1与H264的差别
  10. media_root以及static_root配置
  11. counting objects in class
  12. view和activity的区别(转)
  13. 35W行数据的文本文件,每500行添加4个换行符。代码实现思路
  14. C#如何连接wifi和指定IP
  15. ELK安装
  16. 【Java】运用泽勒一致性计算某天是星期几
  17. 理解java容器:iterator与collection,容器的起源
  18. 开源 DotNetty 实现的 Modbus TCP/IP 协议
  19. pyqt5的安装
  20. HADOOP nutch java mysql

热门文章

  1. python-IDE的使用(小白先看)
  2. linux文件io与标准io
  3. [Web 前端] 011 css 背景属性
  4. [19/05/20-星期一] CSS_css的盒子模型
  5. eclipse中常用的快捷键【开发常用到的】
  6. CentOS6 破解登录密码
  7. VBA中Let与Set的区别
  8. SQLServer查看及设置最大连接数
  9. js string相关方法
  10. openstack stein部署手册 3. keystone