闭包:在函数内部创建另一个函数,使得内部函数可以调用外部函数的参数与变量
1.
function fn(){
var name = '冰冻黑熊';
return function(){
var n=0;
return name;
}
}
var fn1 = fn()
console.log(fn1())//冰冻黑熊
上面这段代码中,创建一个匿名函数,这个函数在fn()作用域内部,可以获取name的值,将name作为返回值赋给全局域下的变量b,即实现全局变量下获取到局部变量中的变量的值。
2
function fn(){
var num = 3;
return function(){
var n=0;
console.log(++n);
console.log(++num)
}
}
ar fn1 = fn()
// 内存消耗
fn1()// 1 4
fn1()//1 5
函数执行完时,里面的变量会被销毁,上面例子中,匿名函数作为返回值赋值给了fn1,且匿名函数引用fn中的变量Num,此时num无法被销毁。
3
for(var i = 0;i<5;i++){
setTimeout(function(){
console.log(i);//5 5 5 5 5
},500)
}
js 单线程,执行for循环时,定时器并不会马上执行,而是加入等待队列中等待执行,等到定时器执行时,for循环结束,i的值变为5。
解决方法:
for(var i = 0;i<5;i++){
(function(i){
setTimeout(function(){
console.log(i)
},500*i)
})(i);
}
使用闭包,将定时器封入执行函数中,将for循环中的i值作为参数传递
var num = 15
var fn1 = function(x){
if(x>num){
console.log(x)
return x
}
}
var a= function(fn1){
var num = 100;
fn1(20)//20
}(fn1)
通过闭包fn1作为参数传入a中,fnl(20)传入x中,此时Num取全局域(创建fn1函数的作用域),20>15,输出20
好处:a.防止变量污染,保护变量安全。
坏处:a.私有变量一旦被引用,便不能被销毁,会增大内存消耗