闭包

36 阅读1分钟

例一

const btn = document.querySelector('#btn')
let count = 1

btn.addEventListener('click', function() {
    ++count
    console.log(count)
})

例一中,count是全局变量,**全局变量只有你关闭浏览器或页面才会被销毁!**所以count仿佛就有了存储功能,能够记录每次变化后的值,你点或者不点,count就乖乖呆在那里,保持着上次点击++后的值。

例二

const btn = document.querySelector('#btn')

btn.addEventListener('click', function() {
    let count = 1
    ++1
    console.log(count)
})

例二中,用户每次点击按钮,函数执行完毕后,count会被当成没用的变量回收了,换句话说就是内存被销毁了!(没有用的局部变量就会被销毁内存)

例三

!(function() {
    const btn = document.querySelector('#btn')
    let count = 1

    btn.addEventListener('click', function() {
        ++count
        console.log(count)
    })
})();

例三中,闭包最大的特性就是,如果函数使用了函数外的某个变量,那这个变量就会享受和全局变量一样的特权,不会被回收啊!除非你关闭浏览器或页面!

那么什么是内存泄漏?

很简单,如果像这种享受全局变量不会被销毁的特权的闭包达到一定数量,那内存就要被撑爆了,电脑对浏览器是很抠门的,内存就分配了这么点,一多就会爆,这就是内存泄漏。