闭包的概念

由于在Javascript语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成“定义在一个函数内部的函数”。

变量的作用域

要理解闭包,首先必须理解Javascript特殊的变量作用域。

变量的作用域无非就是两种:全局变量和局部变量。

Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量。

var n=999;
function f1(){alert(n);
}
f1(); // 999

在函数外部自然无法读取函数内的局部变量。

function f1(){var n=999;
}
alert(n); // error

需要注意,函数内部声明变量的时候,一定要使用var命令。如果不用的话,你实际上声明了一个全局变量!


function f1(){n=999;
}
f1();
alert(n); // 999

如何从外部读取局部变量?

出于种种原因,我们有时候需要得到函数内的局部变量。但是,前面已经说过了,正常情况下,这是办不到的,只有通过变通方法才能实现。

那就是在函数的内部,再定义一个函数。


function f1(){n=999;function f2(){alert(n); // 999}
}

在上面的代码中,函数f2就被包括在函数f1内部,这时f1内部的所有局部变量,对f2都是可见的。

但是反过来就不行,f2内部的局部变量,对f1 就是不可见的。这就是Javascript语言特有的“链式作用域”结构(chain scope),子对象会一级一级地向上寻找所有父对象的变量。所以,父对象的所有变量,对子对象都是可见的,反之则不成立。

既然f2可以读取f1中的局部变量,那么只要把f2作为返回值,我们不就可以在f1外部读取它的内部变量了吗!

function f1(){n=999;function f2(){alert(n);}return f2;
}
var result=f1();
result(); // 999

闭包的用途

  • 可以读取函数内部的变量
  • 让这些变量的值始终保持在内存中

闭包的注意点

  • 因为闭包会把函数中的变量始终保存在内存中,内存消耗大,不能滥用,否则会造成性能问题。在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。
  • 闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值。

Javascript的垃圾回收机制

在Javascript中,如果一个对象不再被引用,那么这个对象就会被GC回收。如果两个对象互相引用,而不再被第3者所引用,那么这两个互相引用的对象也会被回收。因为函数a被b引用,b又被a外的c引用,这就是为什么函数a执行后不会被回收的原因。

路漫漫其修远兮,吾将上下而求索~~

转载于:https://www.cnblogs.com/adoctors/p/8505885.html

浅谈JavaScript--闭包相关推荐

  1. 闭包 | 浅谈JavaScript闭包问题

    1.前言 闭包这个东西在JavaScript中是一个很强大的东西,但是在初学的阶段总是被其概念绕晕,搞不清楚到底什么是闭包,感觉很高深.作者在刚学的时候也有一点懵圈,多看几次就会有自己的理解.任何东西 ...

  2. 浅谈javascript中原型(prototype)、构造函数、对象实例及三者之间的关系

    转自:http://www.cnblogs.com/zhangwei412827/archive/2012/12/14/2816263.html 浅谈javascript中原型(prototype). ...

  3. 浅谈JavaScript作用域,关于Java的学习路线资料

    javascript是目前web领域中使用非常广泛的语言,不管是在前端还是在后端都能看到它的影子,可以说web从业者不论怎样都绕不开它.在前端领域,各种框架层出不穷.在后端领域,nodejs可谓如火如 ...

  4. 浅谈 JavaScript 编程语言的编码规范--转载

    原文:http://www.ibm.com/developerworks/cn/web/1008_wangdd_jscodingrule/ 对于熟悉 C/C++ 或 Java 语言的工程师来说,Jav ...

  5. JavaScript 中的 require / exports、import / export、浅谈JavaScript、ES5、ES6

    Node.js 的基础教学 之 exports 和 module.exports:https://zhuanlan.zhihu.com/p/82057593 浅谈 JavaScript.ES5.ES6 ...

  6. html 滚动条 scrolltop scrollheight,浅谈JavaScript中scrollTop、scrollHeight、offsetTop、offsetHeight...

    浅谈JavaScript中scrollTop.scrollHeight.offsetTop.offsetHeight 发布时间:2020-07-17 09:27:20 来源:亿速云 阅读:223 作者 ...

  7. 浅谈 JavaScript 编程语言的编码规范

    转自:http://www.ibm.com/developerworks/cn/web/1008_wangdd_jscodingrule/?ca=drs-tp4608 developerWorks 中 ...

  8. 浅谈JavaScript中的NaN

    浅谈JavaScript中的NaN NaN概念以及简单案例 追寻的纯粹该拥有自己的本质.-JC.F 什么是NaN? NaN:NaN(Not a Number),它表示不是数字,但是仍是数值类型. Na ...

  9. python封装继承多态_浅谈JavaScript的面向对象和它的封装、继承、多态

    写在前面 既然是浅谈,就不会从原理上深度分析,只是帮助我们更好地理解... 面向对象与面向过程 面向对象和面向过程是两种不同的编程思想,刚开始接触编程的时候,我们大都是从面向过程起步的,毕竟像我一样, ...

  10. js跟php增加删除信息,浅谈JavaScript数组的添加和删除

    本文给大家浅谈一下JavaScript数组的添加和删除 ,有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助. 1.添加 (1)最简单的方法:为新索引赋值 (2)使用push()和unsh ...

最新文章

  1. jquery实现tab切换加自动滚动切换
  2. (转)Log4J使用笔记
  3. shell中的Here Document
  4. Hungtingdon road surgery
  5. 用tftp 下载/更新ios和配置文件
  6. HarmonyOS之数据管理·关系型数据库的应用
  7. java中 a_java中 a++ 和 ++a
  8. OpenGL 学习 显示列表
  9. 命名集 —— 名字结构
  10. 安卓listview点击空白事件_王者荣耀安卓苹果ios改空白名;重复名字特殊昵称教程...
  11. 2016.11.03回顾 more excel交换两列
  12. html5快捷键自动对齐,【答疑】pr自动对齐的快捷键是什么 - 视频教程线上学
  13. TLS1.2的握手过程——从代码角度
  14. 六个参数帮你全面了解固态硬盘
  15. win10安装super-url出现编码错误解决方法
  16. Resco MobileForms Toolkit 2010的破解
  17. project 2016软件
  18. Fate原理(面试必备)
  19. NoteExpress中PDF批量自定义重命名
  20. Selective Search原理及实现

热门文章

  1. LNMP详解(十二)——Nginx URL重写实战
  2. Linux磁盘管理实战
  3. 华三 h3c ACL配置
  4. Linux之远程连接服务器ssh、telnet
  5. PHP 7.0 5.6 下安裝 phpLDAPadmin 发生错误的修正方法
  6. 【Qt学习笔记】4.事件处理
  7. Android 录音获取分贝值的办法
  8. leetcode------Binary Tree Level Order Traversal II
  9. linux 下 Apache自启动 配置方法
  10. Linux群常见问题整理(一)[转]