前端面试题 _ 闭包

什么是闭包

闭包就是能够读取其他函数内部变量的函数。例如javascript中,只有函数内部的子函数才能读取局部变量,所以闭包可以理解成“定义在一个函数内部的函数”。本质上,闭包是将函数内部和函数连接起来的桥梁。

闭包的特点

  1. 让外部访问函数内部变量成为可能
  2. 局部变量会常驻在内存中(同时会造成内存泄漏:内存长期占用,不能释放)
  3. 可以避免使用全局变量,防止全局变量污染

例子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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章