什么是闭包
变量背包、作用域链、局部变量不销毁、函数体外访问函数的内部变量、内存泄漏、内存溢出、形成块级作用域、柯里化、构造函数中定义特权方法、Vue中数据响应式Observer
闭包的定义:内部函数可以访问到其所在外部函数中声明的参数和变量。 一个函数和词法环境的引用捆绑在一起,这样的组合就是闭包(closure)。一般就是一个函数A,return 其内部的函数B,被 return 出去的 B 函数能够在外部访问 A 函数内部的变量,这时候就形成了一个 B 函数的变量背包,A 函数执行结束后这个变量背包也不会被销毁,并且这个变量背包在A函数外部只能通过B函数访问。
闭包形成的原理:作用域链,当前作用域可以访问上级作用域中的变量。
闭包解决的问题:能够让函数作用域中的变量在函数执行结束之后不被销毁,同时也能在函数外部可以访问函数内部的局部变量。全局作用域中是访问不到局部作用域里面的变量的,js提供的解决办法就是在函数里面在定义一个函数
闭包带来的问题:由于垃圾回收器不会将闭包中变量销毁,于是就造成了内存泄露,内存泄露积累多了就容易导致内存溢出。
闭包的应用:能够模仿块级作用域,能够实现柯里化,在构造函数中定义特权方法、Vue 中数据响应式 Observer 中使用闭包等。
function fn(){
var a=1;
function add(){
console.log(++a); //2
}
return add;
}
var c=fn();
c(); //fn()函数执行后,把fn返回的局部函数赋值给全局变量,由于全局变量在代码执行过程中是不会被销毁的,所以它用到的值即局部函数没有被销毁,而局部函数中使用的变量也就保存下来了
var i = 0;
function fn2(){
function add(){
i++;
console.log(i);
}
return innnerFn;
}
var b= fn2();
var c= fn2();
b(); //1
c(); //2
b(); //3
c(); //4这里i是全局变量,i一直保存在内存中;
//对象中使用闭包
function person(name){
function get(){
console.log(name);
}
this._get=function(){
return get;
}
}
var p=new person('xm');
var pp=p._get();
pp(); //xm