javascript小记-闭包理解
这几天也在看一些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、闭包的用途
①全局访问函数内部的属性
②面向对象编程中,模拟私有属性
最新文章
- java接口中定义成员变量
- 打造程序员的高效生产力工具-mac篇
- MySQL 处理插入过程中的主键唯一键重复值办法
- Struts 笔记 内部资料 请勿转载 谢谢合作
- 转载 jquery $(document).ready() 与window.onload的区别
- MySQL允许远程访问
- Keil RTX systick 初始化
- v4l2简介
- JavaScript高级程序设计48.pdf
- Servlet创建、编译、部署、运行
- ubuntu 新建zend framework 项目
- linux面试
- JAVA课程设计-计算器(201521123028 李家俊)
- SVN使用【介绍SVN、快速入门、解决冲突】
- 企业级PPTP服务器
- consistent hash(一致性哈希算法)
- Delphi线程定时器TThreadedTimer及用法--还有TThreadList用法可以locklist
- 分布式01-Dubbo基础背景
- ios --键盘监听JYKeyBoardListener
- 请输入经过encode编码的URL