JavaScript中的闭包
一、什么是闭包?
闭包 指的是那些引用了另一个函数作用域中变量的函数,通常是在嵌套函数中实现的。 ——摘录自《JavaScript高级程序教程》
function fn1() {
let n = 10
}
console.log( n ) //此时会报错,因为在函数的作用域之外无法访问到函数内部的变量
function fn1() {
let n = 10
return function () {
console.log( n )
}
}
fn1()() // 10
二、闭包的产生条件
当前函数执行会形成一个私有的执行上下文,函数执行完毕之后,这个私有执行上下文中的某些变量或方法被该上下文以外的上下文所占用,导致该函数私有上下文无法被释放从而就形成了所谓的————闭包
三、闭包的作用
- 模仿块级作用域,保护函数中私有变量;
function fn(num){
(
function (){
for(let i=0;i<5;i++){
num +=num
}
}
).call();//声明⼀个函数⽴即调⽤以后,浏览器刷新页⾯会报错,可以⽤⼀个⼩括号把整段函数包起来。
console.log(num);
}
fn(5)//160
- 可以读取或储存函数内部的变量;
function fn() {
var a = 1;
return {
function() {
return a
}
}
}
let d = fn()
- 可以用于封装私有变量;
let person = function(){
//变量作⽤域为函数内部,外部⽆法访问
let name = "default ";
return {
getName() {
return name;
},
setName(newName) {
name = newName;
}
};
}();
console.log(person.name);//undefined
console.log(person.getName());//default
person.setName('jack');
三、闭包的缺点
由于闭包会使得函数中的变量都被保存在内存中,内存消耗很⼤,所以不能滥⽤闭包,否则会造成⽹页的性能问题,在IE中可能导致内存泄露。
解决办法:在退出函数之前,将不使⽤的局部变量全部删除。闭包会在⽗函数外部,改变⽗函数内部变量的值。所以,如果你把⽗函数当作对象(object)使⽤,把闭包当作它的公⽤⽅法(Public Method),把内部变量当作它的私有属性(private value),这时⼀定要⼩⼼,不要随便改变⽗函数内部变量的值。