闭包
-
闭包的构成
闭包=函数+词法作用域
- 广义上的闭包:var a=1000; function fn1() { alert(a) } fn1()
- 狭义上的闭包:
指的就是函数嵌套函数,
子函数引用父函数的相关变量
- 狭义上的闭包:
-
闭包的应用场景和实现:
求和,设置字号,循环表单,封装组件和插件
//循环表单
function makeHelp(help) {
return function() {
console.log(help)
document.querySelector('.help').innerHTML=help
}
}
function init() {
var userInfo=[
{id:'username',helpText:'请输入用户名'},
{id:'email',helpText:'请输入邮箱'},
{id:'address',helpText:'请输入地址'},
]
//动态绑定onfocus事件
for(var i=0;i<userInfo.length;i++) {
var item=userInfo[i];
document.getElementById(item.id).onfocus=makeHelp(item.helpText)
}
}
init()
-
闭包的优缺点:
优:- 长期驻留内存,可以缓存数据
- 可以隔离作用域,避免全局污染
缺: - 长期贮存,会导致内存泄露
解决办法:将暴露在外部的闭包变量置为null
-
更好的解决方案:es6里的let