学习前端的童鞋,通常会听到闭包这个名词,不了解的童鞋会觉得这货真高大上。实际上 闭包并没有这么高深莫测,小白也可以理解,这篇blog就以我一个前端小白的视角来解读一下什么是闭包?闭包的用处是什么?
在MDN上,闭包的释义是【闭包是一个函数和声明该函数的词法环境的组合】。小白说我看不懂啊 ,没错,所以上代码:
function init() {
let name = "Mozilla";
// name 是一个被init创建的局部变量
function displayName() {
// displayName() 是一个内部函数,
console.log(`name = ${name}`);
// 一个闭包使用在父函数中声明的变量
}
displayName();
}
init();
在代码中,displayName这个函数调用了init函数中的局部变量name,displayName本身并没有声明过name这个变量,而是直接调用了自己外部的变量。
总结来说,闭包可以理解为函数与函数可以访问的到变量的组合。
那么闭包到底有什么用呢?
闭包常常用来间接访问一个变量。还是回到刚才那段代码;
displayName直接调用了外部变量name,这是由js作用域造成的,并不是我们故意使用闭包,而是我们在日常写代码中经常书写了满足闭包定义的代码,并且这样方便使用。
闭包还可以用来模拟类似java中的私有函数
var Counter = (function() {
var privateCounter = 0;
function changeBy(val) {
privateCounter += val;
}
return {
increment: function() {
changeBy(1);
},
decrement: function() {
changeBy(-1);
},
value: function() {
return privateCounter;
}
}
})();
console.log(Counter.value()); /* logs 0 */
Counter.increment();
Counter.increment();
console.log(Counter.value()); /* logs 2 */
Counter.decrement();
console.log(Counter.value()); /* logs 1 */
这段代码里Counter创建了一个私有变量privateCounter,一个私有函数changeBy,调用这两个私有项只能通过调用Counter.increment,Counter.decrement 和 Counter.value三个函数来实现,外部的其他函数不能使用。
以上是我对闭包的理解,如果有错误 欢迎指出~