什么是闭包
概念:闭包是作用域的一种特殊应用
触发闭包的情况
1、函数当做返回值被返回
2、函数当做参数被传递
3、自执行匿名函数
闭包的应用
1、隐藏变量
2、解决 for i 的问题
作用域
全局作用域、局部作用域
自由变量
不在自己作用域里的变量,就是自由变量
自由变量的值:在函数定义的地方向上层作用域查找。与函数调用位置无关
<script>
const a = 100; //全局变量
function fn() {
console.log(a);//自由变量
}
</script>
// 情况1:函数当返回值被返回
function fn() {
const a = 1;
return function () {
console.log(a);
};
}
const a = 5;
const cb = fn();
cb();
// 情况2:函数当做参数传递
function fn(cb) {
const a = 100;
cb();
}
const a = 500;
fn(function () {
console.log(a);
})
// 情况3:自执行匿名函数
(function (index) {
console.log(index);
})(10);
<body>
<button>0</button>
<button>1</button>
<button>2</button>
<button>3</button>
<button>4</button>
</body>
<script>
const aBtn = document.getElementsByTagName("button");
// for (var i = 0; i < aBtn.length; i++) {
// (function (index) {
// aBtn[i].onclick = function () {
// console.log(index);
// };
// })(i)
// }
for (let i = 0; i < aBtn.length; i++) {
aBtn[i].onclick = function () {
console.log(i);
}
}
</script>
<script>
// 隐藏变量
function fn() {
const data = {};
return {
set: function (key, val) {
data[key] = val;
},
get: function (val) {
return data[val];
},
}
}
const json = fn();
json.set("age", 18);
console.log(json.get("age"));
</script>