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).面向对象的语言有一个标志,那就是类的概念,而通过类可以创建任意多个具有相同属性和方法的对象.但是, ...
随机推荐
- xampp3.2下mysql中文乱码终极解决方案
xmapp3.2.2中mysql已经被替换成了Mariadb,网上那些显示char语句已经失灵. 另外本文主要介绍的是手动在mysql中写入中文乱码问题 那么我们将采用如下三个步骤解决乱码问题 1.打 ...
- wxWidgets编译安装gtk问题的解决办法
下面是google到的一篇博文.我在centos5.3中想安装amule,结果编译时,提示没找到wxWidgets退出了.只好又去下了wxWidgets,还是源码,需要编译.编译中出现和下面这位网友一 ...
- springMVC发送邮件
springMVC发送邮件 利用javax.mail发送邮件,图片与附件都可发送 1,Controller类 package com.web.controller.api; import javax. ...
- android windows
获取当前设备的分辨率 DisplayMetrics dm=new DisplayMetrics(); //新建一个分辨对象 WindowManager wm=this.getWindowManager ...
- hashmap两种遍历方法
第一种:使用entryset来进行遍历 Map map=new HashMap(); Iterator iter=map.entrySet().iterator(); while(iter.hasNe ...
- linux查看负载
LINUX下查看负载 1,查看磁盘 df -h 2,查看内存大小 free free [-m|g]按MB,GB显示内存 vmstat 3,查看cpu cat /proc/cpuinfo 只看cpu数量 ...
- js 判断IOS版本号
先来观察 iOS 的 User-Agent 串: Phone 4.3.2 系统:Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_3_2 like Mac OS X; e ...
- dede文章调用时过滤调 body里面的style属性和值
dede 发布文章的时候会在里面的标签中添加一些style 属性,现在改网站想去掉这些属性和里面的值,因为文章太多所以就用下面的方法 \include\arc.listview.class.php 在 ...
- 美国安全公司HBGary——国家授命的黑客
入侵电脑,窃听用户,假身份上网——美国安全公司HBGary是电脑防护和间谍软件的供应商.而其客户中就有美国的国家安全机构.现在,该公司被偷的电子邮件可以让我们对其数字化战争中的业务做一个初步 ...
- thinkPHP--SQL查询
一.查询方式 ThinkPHP 提供了三种基本的查询方式:字符串条件查询.索引数组条件查询和对象条件查询. 在大多数情况下,推荐使用索引数组和对象方式作为查询条件,因为会更加安全 1.使用字符串作为条 ...