闭包
定义
在MDN上的定义为:函数和对其周围环境的引用捆绑在一起构成闭包,可以让使用者从函数内部访问外部函数的作用域。
- 定义中的周围环境指的是词法环境或者叫词法作用域。作用为根据源代码中声明变量的位置来确定该变量在何处可用。
因此,闭包可以通俗的理解为:函数与函数内部能访问到的变量的总和。
形如
function funA(){
var a = 10;
return function(){
console.log(a)
}
}
var b = funA();
b();
作用
- 可以在函数的外部访问到函数内部的局部变量
- 可以让这些变量始终保存在内存中,不会随着函数的结束而自动销毁
闭包为什么存在
其作用就是闭包存在的意义。
首先,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的值,只能通过addNum
和reduceNum
两个函数。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。