这几天也在看一些javascript的知识,算是对以往的一个复习,现小记一下,方便以后查询。

相信大家在研究javascript的高级特性的时候,肯定会遇到闭包的概念,自己在各种复习资料中,也发现了不同作者的不同理解,为了更好的理解,也综合了一下大家的见解,现总结如下:

1、什么是闭包

闭包的严格定义是“由函数(环境)及其封闭的自由变量组成的集合体。这个定义有些晦涩难懂,我们暂且不用管;

实际上,闭包不是一门技术,是一个语言特性;

通俗的讲,javascript中每个函数都是一个闭包,但通常意义上嵌套的函数更能体现闭包的特性

2、什么时候产生闭包

首先看一个例子

①内部函数读取全局变量

 var n='fanfan';

 function f1(){

   alert(n);

 }

 f1(); //  fanfan

②函数外部读取函数内部变量

 function f1(){

   var n='fanfan';

 }

 alert(n); // error

说明,函数外部读取不了函数内部变量,但是如果从外部读取内部变量,可用到下面方法

 function f1(){

   var n='fanfan';

     function f2(){

     alert(n);

   }

     return f2;

 }

 var result=f1();

 result(); // fanfan

这样就做到了,在函数f1外部,读取到了内部的变量,而此时就产生了闭包。

所以,当一个函数返回他内部定义的一个函数时,就产生了一个闭包(外部函数返回了内部函数的引用)

闭包就是将函数内部和函数外部连接起来的一座桥梁。

闭包不但包括被返回的函数,还包括这个函数的定义环境。

可通过下面的例子理解

 var generateClosure = function() {
  var count = 0;
  var get = function() {
    count ++;
    return count;
  };
  return get;
};
var counter1 = generateClosure();
var counter2 = generateClosure();
console.log(counter1()); // 输出 1
console.log(counter2()); // 输出 1
console.log(counter1()); // 输出 2
console.log(counter1()); // 输出 3
console.log(counter2()); // 输出 2

上面这个例子解释了闭包是如何产生的:

counter1 和 counter2 分别调用了 generateClosure() 函数,生成了两个闭包的实例,

它们内部引用的 count 变量分别属于各自的运行环境。

我们可以理解为,在 generateClosure() 返回 get 函数时,私下将 get 可能引用到的 generateClosure() 函数的内部变量(也就是 count 变量)也返回了,

并在内存中生成了一个副本,之后 generateClosure() 返回的函数的两个实例 counter1和 counter2 就是相互独立的了。

3、闭包的用途

①全局访问函数内部的属性

②面向对象编程中,模拟私有属性

最新文章

  1. java接口中定义成员变量
  2. 打造程序员的高效生产力工具-mac篇
  3. MySQL 处理插入过程中的主键唯一键重复值办法
  4. Struts 笔记 内部资料 请勿转载 谢谢合作
  5. 转载 jquery $(document).ready() 与window.onload的区别
  6. MySQL允许远程访问
  7. Keil RTX systick 初始化
  8. v4l2简介
  9. JavaScript高级程序设计48.pdf
  10. Servlet创建、编译、部署、运行
  11. ubuntu 新建zend framework 项目
  12. linux面试
  13. JAVA课程设计-计算器(201521123028 李家俊)
  14. SVN使用【介绍SVN、快速入门、解决冲突】
  15. 企业级PPTP服务器
  16. consistent hash(一致性哈希算法)
  17. Delphi线程定时器TThreadedTimer及用法--还有TThreadList用法可以locklist
  18. 分布式01-Dubbo基础背景
  19. ios --键盘监听JYKeyBoardListener
  20. 请输入经过encode编码的URL

热门文章

  1. 22 Gobs of data 设计和使用采集数据的包
  2. 缓存数据库-redis介绍
  3. Codeforces 946D Timetable(预处理+分组背包)
  4. B树 B+树 红黑树
  5. MySQL学习笔记:少用Null
  6. Shell学习笔记:#*、%*字符串掐头去尾方法
  7. 【POJ】2069.Super Star
  8. Django实战(13):在session中保存购物车
  9. 最短路算法 -- SPFA模板
  10. CSUOJ 1018 Avatar