<body>
<!-- 一个函数里面嵌套一个函数就是闭包,里面的函数可以访问外层函数的变量 -->
<script>
function out() {
let arr = [1, 2, 3];
return function read() {
return arr;
}
read();
}
const res = out();
console.log(res()[1]); //4
// 通过闭包在window下面可以使用数组arr
// 优点:避免造成全局污染
// 缺点:变量不会被垃圾回收机制回收,增加了内存的消耗
for (var i = 0; i < 5; i++) {
setTimeout(() => {
console.log(i);
})
}
console.log(i); //5
// 很明显,输出5个5;同步创建5个定时器,之后执行异步函数。此时的i为5
// ES6中新增的let可以改变结果,但是无法从for循环外面访问变量
// for (let j = 0; j < 5; j++) {
// setTimeout(() => {
// console.log(j); //0,1,2,3,4
// })
// }
// console.log(j); //j is not undefined
for (var m = 0; m < 5; m++) {
setTimeout((() => {
console.log(m); //0,1,2,3,4
})())
}
console.log(m); //j is not undefined
// setTimeout里面的回调函数写成立即执行函数,调用的是外面的作用域,从而形成了闭包。
// 待主线程结束时,执行异步。输出对应的m值,而不是m的最后结果。
</script>
</body>
什么是闭包?
最新推荐文章于 2024-08-26 10:49:39 发布