什么是闭包
闭包就是能够读取其他函数内部变量的函数。例如javascript中,只有函数内部的子函数才能读取局部变量,所以闭包可以理解成“定义在一个函数内部的函数”。本质上,闭包是将函数内部和函数连接起来的桥梁。
闭包的特点
- 让外部访问函数内部变量成为可能
- 局部变量会常驻在内存中(同时会造成内存泄漏:内存长期占用,不能释放)
- 可以避免使用全局变量,防止全局变量污染
例子1
var age = 10;
function foo(){
console.log(age);//-----------------1
var name = "hunt_bo";
return function(){
console.log(name);//----------2
}
}
console.log(name);//---------------3
var bar = foo();
bar();
这里运行的时候,1 和 2 是可以打印出来的,3是打印不出来,同时也是报错的。
但是bar()在外部执行调用的时候,是可以完全拿到局部变量的的name的值。这就是闭包的定义,也是上面闭包的第一个特点。
例子2
function addCount(){
var count = 0;
return function(){
count += 1;
console.log(count);
}
}
var fun1 = addCount();
var fun2 = addCount();//fun1和fun2是引用的地址不一样
fun1();//1
fun1();//2 因为保存在内存中所以是2 后面是3
fun1();//3
fun2();//1 这里是新的内存地址
fun2();//2
fun1();//4
两个例子差不多,运行的结果是132124可能有同学的疑问是为什么不是123456或者是6个1呢?因为每次在函数执行完的时候的变量会存在内存中,所以会加1;fun1 和fun2两个都会创建新的地址,互不干扰。
例子3
function fnnn(){
var arr = [];
for(var i = 0;i < 5;i ++){ //let正常 也是提醒我们写代码规范的重要性
arr[i] = function(){
return i;
}
}
return arr;
}
var list = fnnn(); //这时候里面的数据都是5
for(var i = 0;i < list.length ; i ++){
console.log(list[i]());
}
这是一道面试题,不要张开就来结果12345,var定义的的i,在函数中直接返回,再调用的时候i已经变成5了。
我是杨小浩,我们一起加油!
本文参考:https://blog.csdn.net/Hunt_bo/article/details/107699137