一:什么是闭包  

  《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-我理解的闭包的更多相关文章

  1. 我从来不理解JavaScript闭包,直到有人这样向我解释它...

    摘要: 理解JS闭包. 原文:我从来不理解JavaScript闭包,直到有人这样向我解释它... 作者:前端小智 Fundebug经授权转载,版权归原作者所有. 正如标题所述,JavaScript闭包 ...

  2. JS中的的"闭包"?深入Javascript之this

    看了知乎上的话题 如何才能通俗易懂的解释javascript里面的‘闭包’?,受到一些启发,因此结合实例将回答中几个精要的答案做一个简单的分析以便加深理解. 1. "闭包就是跨作用域访问变量 ...

  3. JS之作用域与闭包

    JS之作用域与闭包   作用域在JS中同样也是一个重要的概念.它不复杂,因为ES5中只有全局作用域和函数作用域,我们都知道他没有块级作用域.但在ES6中多了一个let,他可以保证外层块不受内层块的影响 ...

  4. 理解 JavaScript 闭包

    这是本系列的第 4 篇文章. 作为 JS 初学者,第一次接触闭包的概念是因为写出了类似下面的代码: for (var i = 0; i < helpText.length; i++) { var ...

  5. 深入理解JavaScript闭包【译】

    在<高级程序设计>中,对于闭包一直没有很好的解释,在stackoverflow上翻出了一篇很老的<JavaScript closure for dummies>(2016)~ ...

  6. 轻松理解JavaScript闭包

    摘要 闭包机制是JavaScript的重点和难点,本文希望能帮助大家轻松的学习闭包 一.什么是闭包? 闭包就是可以访问另一个函数作用域中变量的函数. 下面列举出常见的闭包实现方式,以例子讲解闭包概念 ...

  7. 理解Python闭包概念

    闭包并不只是一个python中的概念,在函数式编程语言中应用较为广泛.理解python中的闭包一方面是能够正确的使用闭包,另一方面可以好好体会和思考闭包的设计思想. 1.概念介绍 首先看一下维基上对闭 ...

  8. vue自定义指令(Directive中的clickoutside.js)的理解

    阅读目录 vue自定义指令clickoutside.js的理解 回到顶部 vue自定义指令clickoutside.js的理解 vue自定义指令请看如下博客: vue自定义指令 一般在需要 DOM 操 ...

  9. js匿名函数和闭包总结

    js匿名函数和闭包总结 一.总结 一句话总结:匿名函数的最主要作用是创建闭包,闭包就是将函数内部和函数外部连接起来的一座桥梁.内层的函数可以使用外层函数的所有变量,即使外层函数已经执行完毕.闭包可以用 ...

  10. js面向对象理解

    js面向对象理解 ECMAScript 有两种开发模式:1.函数式(过程化),2.面向对象(OOP).面向对象的语言有一个标志,那就是类的概念,而通过类可以创建任意多个具有相同属性和方法的对象.但是, ...

随机推荐

  1. 基于Python的函数回归算法验证

    看机器学习看到了回归函数,看了一半看不下去了,看到能用方差进行函数回归,又手痒痒了,自己推公式写代码验证: 常见的最小二乘法是一阶函数回归回归方法就是寻找方差的最小值y = kx + bxi, yiy ...

  2. spi can't create GMem lock

    管理员身份启动cmd,输入下方命令 netsh winsock reset Successfully之后重启电脑就解决了

  3. win7删除一些顽固的文件夹

    创建一个记事本,键入以下命令: DEL /F /A /Q \\?\%1 RD /S /Q \\?\%1 然后保存为bat文件,然后将要删除的文件或文件夹拖入bat的文件图标上,既可以强力删除一些无法删 ...

  4. mysql 忘记root 密码的解决方法

    LINUX 1.切换root 用户 2.停止mysqld 服务 /etc/inid.d mysqld stop 3.跳过验证登录 mysqld_safe --skip-grant-tables &am ...

  5. Linux内核分析总结

    张潇月 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 学习目录: (1)计算机是如何工作的   h ...

  6. GPS开发之知识储备(NMEA0183)

    GPS是英文Global Positioning System(全球定位系统)的简称. NMEA0183(http://files.cnblogs.com/files/libra13179/NMEA0 ...

  7. androidstudio 配置git和github

    git是版本控制工具 github是一个网站,git可以把项目上传至这个网站 1:先下载git,并且安装,一般默认即可,安装成功可以点击电脑右键出现 2:生成id_rsa.pub, 配置账号和邮箱 点 ...

  8. KBMMW 4.92.00 发布

    We are happy to announce the release of kbmMW Professional and Enterprise Edition. Yet again kbmMW c ...

  9. fcitx jdk maven profile配置

    #小企鹅输入法配置 export GTK_IM_MODULE=fcitx export QT_IM_MODULE=fcitx export XMODIFIERS="@im=fcitx&quo ...

  10. .net如何向csv添加一列

    using System;using System.Collections.Generic;using System.Drawing;using System.Globalization;using ...