雖然身爲一個java程序員,但是覺得了解前端知識是很有必要的,js中有一個比較難的知識點--閉包,不知道大家對閉包是怎樣理解的。接下來通過一個小例子來帶大家瞭解下js中的閉包。
何爲閉包:(把內部函數保存到外部一定會形成閉包,閉包會導致原有作用域鏈不釋放,造成內存泄露。)
再瞭解閉包之前,得先知道函數的預編譯、作用域以及作用域鏈(大家自行了解)。
我們的demo:大家可以自己運行一下,答案是10個10沒錯吧。
function test(){
var arr = [];
for(var i = 0; i < 10; i++){
arr[i] = function (){
console.log(i);
}
}
return arr;
}
var arr = test();
for(var i = 0; i < 10; i++){
arr[i]();
}
arr數組中保存的每個函數訪問的i變量是存在test函數的執行期上下文中的,這個一定要了解,因此指向的是同一個變量,arr數組中訪問的時候也就是訪問的同一變量,而test函數中的i變量循環10次之後每次++變爲了10,因此輸出10個10
(下面這個的結果是0-9)曾經我一度以爲這種爲什麼結果跟上面的不一樣 ,因爲這種沒有形成閉包,大家訪問的不是同一變量
var arr = new Array();
for(i = 0; i < 10; i++){
arr[i] = function (){
console.log(i);
}
}
for(var i = 0; i < 10; i++){
arr[i]();
}
那我們怎麼修改原來的可以打印0-9呢?這時候就要用到立即執行函數了(這樣就可以實現打印0-9):
function test(){
var arr = [];
for(var i = 0; i < 10; i++){
(function (j){
arr[j] = function(){
console.log(j);
}
}(i));
}
return arr;
}
var arr = test();
for(var i = 0; i < 10; i++){
arr[i]();
}
如果大家有興趣瞭解的更深一點,可以去看一下網易雲課堂姬成老師的js課程,其他平臺應該也有,課程相當nice的,重要的是免費的哦~