js-我理解的闭包
一:什么是闭包
《JS高级程序设计》指出:闭包是指有有权访问另一个函数作用域中变量的函数。
二:闭包的使用
闭包的常见的创建方式是 子函数嵌套在父函数的内部,这样,子函数就可以访问父函数中的变量。
function add(){
var a=1;
//暂且叫 innerAdd 函数
return function(){
a++;
console.log(a);
}
}
add()();
add()();
console.log("------------------------");
var addAfter=add();
addAfter();
addAfter();
8行---- 2
9行-----2
12,13行 ---2,3
那么,为什么第9行得到的结果仍然是2,而不是期待中的3呢?
这里因为JS里也有 C# Java里中的 垃圾回收 机制。
(1) 函数未被引用,执行完后,该函数作用域就会被回收。
(2)函数如果被其他变量引用,该函数作用域就会被保存下来。
第8,9行,add()函数并没有被其他变量引用,只是简单的执行,因此,a的作用域只存在该函数中。
11行,add()函数被外部变量 addAfter引用,函数中的a的值被保存在内存中。
可以这样说:如果innerAdd函数被父亲函数add之外的函数所引用,这样就形成了一个闭包,否则,是不能形成闭包的。
还有另外一种使用形式:
var addMatch=(function(){
var a=22;
return function(){
a++;
console.log(a);
}
})();
addMatch();
addMatch();
三:闭包的问题
闭包只能取得包含函数中的最后一个变量值,保存的是整个变量对象,而不是某个特殊的变量。
var arr1=[12,19,3],arr2=[],arrLength=arr1.length;
for(var i=0;i<arrLength;i++){
arr2[i]=function(){
console.log(i);
return i;
};
}
四:闭包的应用场景
五:总结
<script type="text/javascript">
//理解闭包学会三个基本事实
// 一、JS 允许引用在当前函数以外定义的变量
function makeOffice(name) {
function make(age) {
return name + '----' + age;
} return make(19);
} var result = makeOffice("herry");
//二、即使外部函数已经返回,当前函数仍然可以引用在外部函数所定义的变量
function makeOffice2(name) {
function make(age) {
return name + '----' + age;
} return make;
}
var f = makeOffice2('jack');
var result2 = f('20');//即使makeOffice2函数已经返回,make 函数仍能记住makeOffice2的值 //函数可以引用在其作用域范围内的任何变量 包括参数和外部函数的变量
function makeOffice3(name) {
return function (age) {
return name + '----' + age;
};
}
//三 闭包可以更新外部变量的值
//闭包存储的是外部变量的引用,而不是它们值得副本
function box() {
var val = undefined;
return {
set: function (newValue) {
val = newValue;
},
get: function () {
return val;
},
type: function () {
return typeof val;
}
};
}
</script>
js-我理解的闭包的更多相关文章
- 我从来不理解JavaScript闭包,直到有人这样向我解释它...
摘要: 理解JS闭包. 原文:我从来不理解JavaScript闭包,直到有人这样向我解释它... 作者:前端小智 Fundebug经授权转载,版权归原作者所有. 正如标题所述,JavaScript闭包 ...
- JS中的的"闭包"?深入Javascript之this
看了知乎上的话题 如何才能通俗易懂的解释javascript里面的‘闭包’?,受到一些启发,因此结合实例将回答中几个精要的答案做一个简单的分析以便加深理解. 1. "闭包就是跨作用域访问变量 ...
- JS之作用域与闭包
JS之作用域与闭包 作用域在JS中同样也是一个重要的概念.它不复杂,因为ES5中只有全局作用域和函数作用域,我们都知道他没有块级作用域.但在ES6中多了一个let,他可以保证外层块不受内层块的影响 ...
- 理解 JavaScript 闭包
这是本系列的第 4 篇文章. 作为 JS 初学者,第一次接触闭包的概念是因为写出了类似下面的代码: for (var i = 0; i < helpText.length; i++) { var ...
- 深入理解JavaScript闭包【译】
在<高级程序设计>中,对于闭包一直没有很好的解释,在stackoverflow上翻出了一篇很老的<JavaScript closure for dummies>(2016)~ ...
- 轻松理解JavaScript闭包
摘要 闭包机制是JavaScript的重点和难点,本文希望能帮助大家轻松的学习闭包 一.什么是闭包? 闭包就是可以访问另一个函数作用域中变量的函数. 下面列举出常见的闭包实现方式,以例子讲解闭包概念 ...
- 理解Python闭包概念
闭包并不只是一个python中的概念,在函数式编程语言中应用较为广泛.理解python中的闭包一方面是能够正确的使用闭包,另一方面可以好好体会和思考闭包的设计思想. 1.概念介绍 首先看一下维基上对闭 ...
- vue自定义指令(Directive中的clickoutside.js)的理解
阅读目录 vue自定义指令clickoutside.js的理解 回到顶部 vue自定义指令clickoutside.js的理解 vue自定义指令请看如下博客: vue自定义指令 一般在需要 DOM 操 ...
- js匿名函数和闭包总结
js匿名函数和闭包总结 一.总结 一句话总结:匿名函数的最主要作用是创建闭包,闭包就是将函数内部和函数外部连接起来的一座桥梁.内层的函数可以使用外层函数的所有变量,即使外层函数已经执行完毕.闭包可以用 ...
- js面向对象理解
js面向对象理解 ECMAScript 有两种开发模式:1.函数式(过程化),2.面向对象(OOP).面向对象的语言有一个标志,那就是类的概念,而通过类可以创建任意多个具有相同属性和方法的对象.但是, ...
随机推荐
- Node.js 自学之旅
学习基础,JQuery 原生JS有一定基础,有自己一定技术认知(ps:原型链依然迷糊中.闭包6不起来!哎!) 当然最好有语言基础,C#,java,PHP等等.. 最初学习这个东西的原因很简单,在园子里 ...
- QTP安装连接Oracle数据库
之前学过一段时间QTP,之后便没用这个笨重的东东,为了以防忘记,再次记录下曾经连接数据库经历了几天才搞好的事情(虽然这个工具可能已经过时,但是国企一般都会使用的) 前提条件: 你已经安装好了QTP / ...
- C#读写者线程(用AutoResetEvent实现同步)(转载)
C#读写者线程(用AutoResetEvent实现同步) 1. AutoResetEvent简介 通知正在等待的线程已发生事件.无法继承此类. 常用方法简介: AutoResetEvent(bool ...
- Linux下安装JDK并配置环境变量
1. 查询是否默认安装有JDK [root@localhost bin]# java -version java version "1.6.0_22" OpenJDK Runtim ...
- 对于有了ACM以后的生活
我是大二学生,才接触ACM不到5个星期,因为受到我们班dalao的"引诱",去参加了一次我们学校举行的萌新杯,于是就入坑了,而我又在校外学习一些关于安全的知识,前几天一直纠结要不要 ...
- log4j输出模板
log4j.rootLogger=DEBUG, A1,A2 log4j.appender.A1.MaxFileSize=1kb#10个备份 log4j.appender.A1.MaxBackupInd ...
- Linux常用性能调优工具索引
root@ubuntu:~# dstat----total-cpu-usage---- -dsk/total- -net/total- ---paging-- ---system--usr sys i ...
- elasticsearch中常用的API
elasticsearch中常用的API分类如下: 文档API: 提供对文档的增删改查操作 搜索API: 提供对文档进行某个字段的查询 索引API: 提供对索引进行操作,查看索引信息等 查看API: ...
- 答:SQLServer DBA 三十问之六:Job信息我们可以通过哪些表获取;系统正在运行的语句可以通过哪些视图获取;如何获取某个T-SQL语句的IO、Time等信息;
6. Job信息我们可以通过哪些表获取:系统正在运行的语句可以通过哪些视图获取:如何获取某个T-SQL语句的IO.Time等信息: 我的MSDB数据库中有全部的表: sys.all_columns,s ...
- mysql 忘记root 密码的解决方法
LINUX 1.切换root 用户 2.停止mysqld 服务 /etc/inid.d mysqld stop 3.跳过验证登录 mysqld_safe --skip-grant-tables &am ...