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、闭包的用途
①全局访问函数内部的属性
②面向对象编程中,模拟私有属性
javascript小记-闭包理解的更多相关文章
- javascript 之闭包-理解不了来找我
1,闭包是什么 (百度百科定义)--闭包是可以包含自由(未绑定到特定对象)变量的代码块:这些变量不是在这个代码块内或者任何全局上下文中定义的,而是在定义代码块的环境中定义(局部变 量).“闭包” 一词 ...
- JavaScript的闭包理解
因为本人是做java web 开发的,对js仅仅是存在非常浅的理解,js闭包的概念非常早就听说了,可是一直都不明确是什么意思,今天准备梳理一下闭关的概念; 闭包(closure)是Javascript ...
- javascript之闭包理解以及应用场景
半个月没写博文了,最近一直在弄小程序,感觉也没啥好写的. 之前读了js权威指南,也写了篇博文,但是实话实说当初看闭包确实还是一头雾水.现在时隔一个多月(当然这一段时间还是一直有在看闭包的相关知识)理解 ...
- JavaScript(8)--- 闭包
JavaScript(8)--- 闭包 理解闭包 我的理解是:闭包就是能够读取其他函数内部变量的函数.由于在Javascript语言中,只有函数内部的子函数才能读取局部变量,因此可以简单这样理解 &q ...
- 深入理解JavaScript的闭包特性如何给循环中的对象添加事件
初学者经常碰到的,即获取HTML元素集合,循环给元素添加事件.在事件响应函数中(event handler)获取对应的索引.但每次获取的都是最后一次循环的索引.原因是初学者并未理解JavaScript ...
- javascript闭包理解
//闭包理解一 function superFun(){ var _super_a='a'; function subfuc(){ console.log(_super_a); } return su ...
- 深入理解javascript的闭包
闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. 一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域 ...
- 如何给循环中的对象添加事件--深入理解JavaScript的闭包特性
初学者经常碰到的,即获取HTML元素集合,循环给元素添加事件.在事件响应函数中(event handler)获取对应的索引.但每次获取的都是最后一次循环的索引.原因是初学者并未理解JavaScript ...
- 理解Javascript 的闭包(closure)
要理解闭包的概念先从变量的作用域说去 一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域无非就是两种:全局变量和局部变量. Javascript语言的特殊之 ...
随机推荐
- 形参前的&&啥意思?
C++2011标准的 右值引用 语法 去搜索“c++11右值引用” 右值引用,当传入临时对象时可以避免一次拷贝. 右值引用.举个例子 C/C++ code ? 1 2 3 4 5 6 7 8 // ...
- gc overhead limit exceeded内存问题
gc overhead limit exceeded 当出现这种问题的时候一般有两种思路 一.修改idea或者eclipse中的配置文件,将内存调到1024即可 二.在代码中通过system.gc 手 ...
- 数据库-python操作mysql(pymsql)
pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb几乎相同 一:安装pymysql pip3 install pymysql 二:使用pytmysql # -*- codin ...
- MyEclipse自带且常用的快捷键和自己定义的快捷键方法步骤
1.MyEclipse自带且常用的快捷键 内容提示(补全): Alt+/ 导包快捷键: Ctrl+Shift+o 格式化代码: Ctrl+Shift+f 行代码位置上下调换: Alt ...
- caffe细节
1.BN层参数设置 在训练时所有BN层要设置use_global_stats: false(也可以不写,caffe默认是false) 在测试时所有BN层要设置use_global_stats: tru ...
- Tomcat底层实现
package myserver; import java.io.IOException;import java.net.ServerSocket;import java.net.Socket; pu ...
- Sql Server2005 Transact-SQL 新兵器学习总结之-排名函数
Transact-SQL提供了4个排名函数: rand() , dense_rand() , row_number() , ntile() 下面是对这4个函数的解释:rank() 返回结果集的分区内每 ...
- Redis(四)Redis高级
一Redis 数据备份与恢复 Redis SAVE 命令用于创建当前数据库的备份. 语法 redis Save 命令基本语法如下: redis 127.0.0.1:6379> SAVE 实例 r ...
- Singleton 多线程
单例模式 何为单例模式,在GOF的<设计模式:可复用面向对象软件的基础>中是这样说的:保证一个类只有一个实例,并提供一个访问它的全局访问点.首先,需要保证一个类只有一个实例:在类中,要构造 ...
- ASP.NET:使用Flurl制作可复用的分页组件
使用ASP.NET MVC查询时,一直使用MvcPaging组件,虽然需要自定义MvcPaging.Pager才能达到我想要的效果,但在没有较好的URL库时,还是这么用.分页的逻辑本来就不复杂,更重要 ...