1.什么是闭包?
闭包是变量的一种。
2.闭包的特点
闭包形成私有的作用域 ,保护私有变量的机制,
让私有变量存到内存里面
var add = (function (){
var count = 0;//局部变量转私有变量,让其内部的返回函数可以访问私有变量
return function(){
count++;
console.log(count);
}
})();
//add 变量指向的 自执行函数
//返回的结果是一个匿名函数
add();
add();
add();
3.弊端
不建议大量使用闭包,闭包的变量存到内存里面,会导致内存泄漏
关于闭包的练习题
var med = "link";
var fun = function(){
console.log(med);
var med = "snk";
return function(){
console.log(med);
}
}
fun()(); */
答案:“snk”
//经典
//函数形参没传值 形参值underfined
function fun(n,o){
console.log(o);
var md = n;
return {
fun:function(m){
return fun(m,md);
}
}
}
//该函数返回的是一个对象 在同一个对象上点的时候值不发生变化
var a = fun(0); a.fun(1); a.fun(2);a.fun(3);
var b = fun(0).fun(1).fun(2).fun(3);//funderfined 0 1 2
//闭包面试题 里面存在闭包 也存在对象之间的调用 对象点 还是对象点连点
var c = fun(0).fun(1);fun(2).fun(3);//underfined 0 1 1
问a,b,c的值什么?
答案:a:0 0 0 0
b:unfined 0 1 2
c:unfined 0 1 1
var res = [];//数组
for(var i = 0;i<10;i++){
var add = function(n){
var c = n;
return function(){
console.log(c);
}
}
res [i] = add(i);//当前函数运行返回的是一个匿名函数
}
res[0]();
res[1]();
res[2]();
计时器闭包问题
//计时器闭包
for(var i = 0;i<10;i++){
setTimeout(function(){
console.log(i);//10 10 10
},0)//这个计时器的延迟是0ms 去执行内部的匿名函数
}
//计时器要占用队列
问:输出值为多少?
答:10 10 10,因为js为单线程,要执行队列,所以每次输出都为最大值。
修改为闭包
for(var i = 0;i<10;i++){
(function(){
setTimeout(function(n){
console.log(n);
},0)
})(i);
}