前端面試題 _ 閉包

什麼是閉包

閉包就是能夠讀取其他函數內部變量的函數。例如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

 

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