2

为什么需要闭包?

我们知道,对于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次了"

闭包的缺点

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

关于这篇文章

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


温浪
943 声望63 粉丝

我回来啦!