闭包

定义

在MDN上的定义为:函数和对其周围环境的引用捆绑在一起构成闭包,可以让使用者从函数内部访问外部函数的作用域。

  • 定义中的周围环境指的是词法环境或者叫词法作用域。作用为根据源代码中声明变量的位置来确定该变量在何处可用。

因此,闭包可以通俗的理解为:函数与函数内部能访问到的变量的总和。

形如

function funA(){  
 var a = 10;  
 return function(){  
 console.log(a)  
 }  
}  
​  
var b = funA();  
b();

作用

  1. 可以在函数的外部访问到函数内部的局部变量
  2. 可以让这些变量始终保存在内存中,不会随着函数的结束而自动销毁

闭包为什么存在

其作用就是闭包存在的意义。

首先,JS和其他语言一样,拥有作用域,其最大的作用就是隔离变量。并且作用域存在上下级关系,由函数是在哪个作用域下创建所确定。

变量取值的过程是先在当前作用域查找值,如果没有则会跳转到上级作用域查找,如果找到就停止,未查找到这继续查找上级作用域直到全局作用域中。

var a = 10;
function fn(){
    var b = 20;
    function bar(){
        console.log(a + b)
    }
    return bar
}

var x = fn(),
    b = 200;
x() //值为10+20=30

变量取值的过程就像一个单向链表,只能从当前作用域开始向上级作用域查找,因此我们也将这个查找过程称为作用域链。

从上面可以看到,函数内部可以访问到外部的变量,而外部无法访问到内部作用域的变量。所以在某些情况下,我们不想某个变量直接暴露,就将这个变量保存在函数中,使其变为局部变量,再使用闭包将其“间接暴露”。

(function countNum(){
    var num = 0;
    window.addNUm = function (){
        num++;
        console.log(num)
    }
    window.reduceNum = function (){
        num--;
        console.log(num)
    }
}())

在这个例子中,要想改变num的值,只能通过addNumreduceNum两个函数。


HeXuan
9 声望1 粉丝

下一篇 »
this关键词