1. 程式人生 > >js閉包詳解原理

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]();
		}