闭包
能够读取其他函数内部变量的函数(通俗点讲:内部的函数被保存到外部)
经典示例
防抖和节流
// 闭包 示例
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规定在一个函数作用域内,程序执行完毕后,变量会被销毁,节省内存。
使用闭包时,按照作用域链的特点,闭包函数外面的变量不会被销毁,因为函数会一直被调用,所以一直存在,会造成内存泄露