闭包的概念

由于在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执行后不会被回收的原因。

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

最新文章

  1. android textView 总是有paddingtop怎么解决
  2. springmvc 动态代理 JDK实现与模拟JDK纯手写实现。
  3. 一起学HTML基础-JavaScritp简介与语法
  4. javascript基础07
  5. NYOJ题目100 1的个数
  6. PS网页设计教程XXV——使用Photoshop设计的老式组合布局
  7. sql commands
  8. SQL Server取系统当前时间【转】
  9. linux 安装scons
  10. Oracle分页查询语句的写法(转)
  11. 手把手教你修改pcduino系统默认的音频输出
  12. eclipse 启动tomcat后 页面无法访问tomcat首页
  13. [Kubernetes]资源模型与资源管理
  14. markdown改变字体颜色和大小
  15. bzoj2748
  16. Lucene/Solr企业级搜索学习资源
  17. mmm和mmma的区别
  18. [Spark RDD_add_2] Spark RDD 分区补充内容
  19. 问题✅:render json的格式支持。to_json被改成as_json,功能一样
  20. chromedriver与google版本的对应

热门文章

  1. php把字符串指定字符分割成数组
  2. javascript作用域与闭包
  3. 序列化工具类({对实体Bean进行序列化操作.},{将字节数组反序列化为实体Bean.})
  4. Eclipse_常用技巧_01_自动添加类注释和方法注释
  5. Execution Context(EC) in ECMAScript
  6. Prototype Chain
  7. JSTL前台报错
  8. OpenCV-Python 霍夫直线检测-HoughLinesP函数参数
  9. Smali文件添加try/catch语句,出现“invalid use of move-exception”异常
  10. POJ1112 Team Them Up!