闭包是什么?
闭包就是一个把函数内部和外部连接起来的桥梁
简单说就是访问函数作用域中的变量的函数
闭包怎么做到的?
函数内部定义的变量是局部的 当局部变量所在的函数被调用的时候 开始执行
调用执行一旦结束 局部变量就会被释放
闭包延长局部变量的执行时间 当函数执行完毕以后 局部变量不可以被内存释放 然后让外部可以访问到这个变量
闭包的特点是什么?
1.函数套函数,闭包一定有嵌套函数
2.外层函数一定有局部变量,且内层函数一定操作了外层函数的这个变量
3.内层函数会使用return返回外部(如果不返回这个内层函数,你就没办法使用这个闭包,返回内层函数的最终的目的就是让外部可以访问到这个闭包)
闭包的示例
比如一个函数 他有局部作用域 我们应该如何拿到里面的值?
function init() {
var name = '123';
function displayName() {
return name
}
return displayName()
}
var a = init()
console.log(a);
这只是个闭包的简单例子
闭包还可以封装存储私有变量
// 封装私有变量
var person = function () {
//变量作用域为函数内部,外部无法访问
var name = "default";
return {
getName: function () {
return name;
},
setName: function (newName) {
name = newName;
}
}
}();
console.log(person);
console.log(person.name);;//直接访问,结果为undefined
console.log(person.getName()); // default);
person.setName("abruzzi");
console.log(person.getName()); // abruzzi
闭包的作用还有保留之前的词法环境 不让变量被释放
function makeAdder(x) {
return function (y) {
return x + y
}
}
var add5 = makeAdder(5)
var add10 = makeAdder(10)
console.log(add5(2)); // 7
并且闭包都是引用自己词法作用域的内的变量
在一个闭包内对变量的修改 不会影响到另外一个闭包中的变量
var makeCounter = function () {
var privateCounter = 0;
function changeBy(val) {
privateCounter += val;
}
return {
increment: function () {
changeBy(1);
},
decrement: function () {
changeBy(-1);
},
value: function () {
return privateCounter;
},
};
};
var Counter1 = makeCounter();
var Counter2 = makeCounter();
console.log(Counter1.value()); /* logs 0 */
Counter1.increment();
Counter1.increment();
console.log(Counter1.value()); /* logs 2 */
Counter1.decrement();
console.log(Counter1.value()); /* logs 1 */
console.log(Counter2.value()); /* logs 0 */
闭包实例 体会存储词法环境
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<style>
body {
font-family: Helvetica, Arial, sans-serif;
font-size: 12px;
}
h1 {
font-size: 1.5em;
}
h2 {
font-size: 1.2em;
}
</style>
<body>
<a href="#" id="size-12">12</a>
<a href="#" id="size-14">14</a>
<a href="#" id="size-16">16</a>
<script>
function makeSizer(size) {
return function () {
document.body.style.fontSize = size + "px";
};
}
var size12 = makeSizer(12);
var size14 = makeSizer(14);
var size16 = makeSizer(16);
document.getElementById("size-12").onclick = size12;
document.getElementById("size-14").onclick = size14;
document.getElementById("size-16").onclick = size16;
// 说实话 感觉闭包多余 不如使用下面的代码实现
// document.getElementById("size-12").onclick = makeSizer(12);
// document.getElementById("size-14").onclick = makeSizer(14);
// document.getElementById("size-16").onclick = makeSizer(16);
</script>
</body>
</html>
整理的闭包相关知识若能帮到大家微末 我将不胜荣幸
若有相关指正 请不吝赐教