JavaScript闭包

67 阅读1分钟

闭包

能够读取其他函数内部变量的函数(通俗点讲:内部的函数被保存到外部)

经典示例 防抖和节流

// 闭包 示例
function a () {
    var aa = 123;
    function b () {
        var aa = 234;
        console.log(aa);  // 可以输出 123
    }
    return b
}

var res = a() // res = function b () { ... }

res() // res(1,2,3) 可以直接给 function b (z,x,c) { console.log(z,x,c) } 传参
// 单例模式(难点)
var createLogin = function () { // 这里会接参
    var div = document.createElement('div'); // createElement() 创建一个新元素
    div.innerHTML = "登录提示框"
    div.style.display = "none"
    document.body.appendChild(div) // appendChild()方法 向节点添加最后一个子节点
    return div
}

var getSingle = function (fn) {
    var result;
    return function () {
        return resule || (result = fn.apply(this,arguments)) // 精妙之处,创建过result会被保存,第二次调用之前创建的
    }
}

var create = getSingle(createLogin)
document.getElementById('loginBtn').onclick = function () {
    var loginLay = create() // 这里可以传参
    loginLay.style.display = "block"
}

闭包的作用

优点

1、隐藏变量,避免全局污染

2、可以读取函数内部的变量

缺点:

1、导致变量不会被垃圾回收机制回收,造成内存消耗

2、不恰当使用闭包会造成内存泄漏

垃圾回收机制:js规定在一个函数作用域内,程序执行完毕后,变量会被销毁,节省内存。 使用闭包时,按照作用域链的特点,闭包函数外面的变量不会被销毁,因为函数会一直被调用,所以一直存在,会造成内存泄露