閉包是指有權訪問另外一個函數做用域中變量的函數,建立閉包的最多見的方式就是在一個函數內建立另外一個函數,經過另外一個函數訪問這個函數的局部變量,利用閉包能夠突破做用鏈域,將函數內部的變量和方法傳遞到外部。javascript
閉包的特性:html
1.函數內再嵌套函數
2.內部函數能夠引用外層的參數和變量
3.參數和變量不會被垃圾回收機制回收java
//li節點的onclick事件都能正確的彈出當前被點擊的li索引 <ul id="testUL"> <li> index = 0</li> <li> index = 1</li> <li> index = 2</li> <li> index = 3</li> </ul> <script type="text/javascript"> var nodes = document.getElementsByTagName("li"); for(i = 0;i<nodes.length;i+= 1){ nodes[i].onclick = function(){ console.log(i+1);//不用閉包的話,值每次都是4 }(i); } </script>
執行say667()後,say667()閉包內部變量會存在,而閉包內部函數的內部變量不會存在; 使得Javascript的垃圾回收機制GC不會收回say667()所佔用的資源; 由於say667()的內部函數的執行須要依賴say667()中的變量; 這是對閉包做用的很是直白的描述node
function say667() { // Local variable that ends up within closure var num = 666; var sayAlert = function() { alert(num); } num++; return sayAlert; } var sayAlert = say667(); sayAlert()//執行結果應該彈出的667