js閉包詳解原理

雖然身爲一個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的,重要的是免費的哦~

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