资讯专栏INFORMATION COLUMN

闭包简介

gxyz / 934人阅读

摘要:是是是,确实是这样,但是闭包还有其他的用途,比如使局部变量始终维持在内存中,来看下面这段代码上面这段代码依次出和,那么就可以知道被保存在了内存中。

为什么需要闭包?

我们知道,对于js来说,函数内部可以访问外部的全局变量,下面这段代码会alert出10:

var n = 10;

function foo() {
    alert(n);
}

foo();

但是反过来,如果我想在外面获取函数内部的值呢?如下代码:

function foo() {
    var n = 10;
}
console.log(n);

肯定会报错,n未定义。

但是我就是想要这个n的值啊,你可能会说,这么折腾干嘛啊,你想要这个n,就在函数里return出来啊,整这么麻烦干嘛。

是是是,确实是这样,但是闭包还有其他的用途,比如使局部变量始终维持在内存中,来看下面这段代码:

function foo() {
  var n = 10;
  var bar = function() {
    alert(n);
    n++;
  }

  return bar;
}

var myFuc = foo();
myFuc();
myFuc();

上面这段代码依次alert出1011,那么就可以知道n被保存在了内存中。那么为什么呢?

你可以这么理解,在foo方法调用完毕后,按理说要把它内部的局部变量都给回收掉。但是!foo方法调用完毕后将bar方法作为返回值返回了,那么bar这个方法就还活着,而bar方法里又有变量n,所以这个n不能被销毁

综上所述, 可以知道闭包最重要的两个作用
1.在外部获取函数体内部的局部变量。
2.维持函数中的局部变量在内存中不被销毁。

什么是闭包?

抛去很多晦涩难懂的定义,我认为阮一峰老师所说的闭包是能够读取其他函数内部变量的函数是最为简洁好理解的。拿上面的例子来说,bar函数可以读取foo函数中的变量n,bar函数就是一个闭包。可以把闭包简单的理解成定义在函数内部的函数。另外知乎某回答也是很形象闭包就是打入敌人内部的间谍,通过他你可以接触敌人对外封锁的信息。

闭包的具体用途

看一个简单的例子:

function warnUser() {
    var n = 0;
    
    return function() {
        n++;
        console.log("别闹啦,你都点了" + n + "次了");     
    }
}

var showWarn = warnUser();
showWarn(); //"别闹啦,你都点了1次了"
showWarn(); //"别闹啦,你都点了2次了"
闭包的缺点

闭包会使变量保存在内存中,内存消耗大,滥用闭包会导致性能问题。

关于这篇文章

因为本人水平有限,而且不喜欢去写让人看半天也看不懂的东西,所以语言比较通俗。而通俗往往也代表着不够严谨,不够深入。所以文中有写的不对或者不合理的地方,希望大家帮忙指出。共勉

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/88800.html

相关文章

  • Python 函数式编程、装饰器以及一些相关概念简介

    摘要:重写內建名字空间中的函数闭包闭包是词法闭包的简称。另一种说法认为闭包是由函数和与其相关的引用环境组合而成的实体。 Python 中的 Decorator(装饰器) 是对一个函数或者方法的封装,从而使其可以完成一些与自身功能无关的工作。 预备知识 一切皆对象 在 Python 中,所有的一切都被视为对象,任何的变量、函数、类等都是 object 的子类。因此除了变量之外,函数和类等也可以...

    Jinkey 评论0 收藏0
  • Deep in JS - 收藏集 - 掘金

    摘要:今天同学去面试,做了两道面试题全部做错了,发过来给道典型的面试题前端掘金在界中,开发人员的需求量一直居高不下。 排序算法 -- JavaScript 标准参考教程(alpha) - 前端 - 掘金来自《JavaScript 标准参考教程(alpha)》,by 阮一峰 目录 冒泡排序 简介 算法实现 选择排序 简介 算法实现 ... 图例详解那道 setTimeout 与循环闭包的经典面...

    enali 评论0 收藏0
  • 函数式编程了解一下(上)

    摘要:一直以来没有对函数式编程有一个全面的学习和使用,或者说没有一个深刻的思考。是不是轻松了其实函数式编程主张的就是以抽象的方式创建函数。后面咱们在系统性的学习下函数式编程。 一直以来没有对函数式编程有一个全面的学习和使用,或者说没有一个深刻的思考。最近看到一些博客文章,突然觉得函数式编程还是蛮有意思的。看了些书和文章。这里记载下感悟和收获。 欢迎团队姜某人多多指点@姜少。 由于博客秉持着简...

    int64 评论0 收藏0
  • JS 基础篇--闭包和引用

    摘要:因为没有块级作用域,只有函数作用域,所以闭包的使用与函数是紧密相关的。模拟私有变量这里返回两个闭包函数和。闭包会在父函数外部,改变父函数内部变量的值。 简介 Javascript 中一个最重要的特性就是闭包的使用。因为闭包的使用,当前作用域总可以访问外部的作用域。因为Javascript 没有块级作用域,只有函数作用域,所以闭包的使用与函数是紧密相关的。 各种专业文献上的闭包(clos...

    EdwardUp 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<