在正常狀況下,函數外部沒法讀取函數內的局部變量,可是能夠在函數內部定義一個新的函數,再return這個函數來實現讀取局部變量javascript
在Javascript中,查找變量時會按照 「做用域鏈」的結構進行,便是會一級一級地向上尋找父函數的變量,也就是說,父函數的全部變量對子函數都是可見的,反子則不成立html
根據上頁代碼運行結果輸出的是」kevin」,執行f3至關於執行了f2函數,在f1內部造成了一個活動對象,在f1執行時,內部的name會覆蓋外部的變量的值,因此name=「kevin」java
F1執行完後會自動銷燬,但內部的f2的引用給了f3,因此name的值沒有銷燬,銷燬的是做用域鏈閉包
<script type="text/javascript"> window.onload = function(){ var $li = document.getElementsByTagName("li"); /* for (i = 0; i < $li.length; i++) { $li[i].onclick = (function(n){ console.log($li[n].innerHTML); })(i) };*/ for (var i = 0; i < $li.length; i++) { $li[i].onclick = (function(n){ return function (){ console.log($li[n].innerHTML); }; })(i) }; } </script> </head> <body> <ul> <li>廣州</li> <li>上海</li> <li>北京</li> <li>南京</li> </ul> </body>
閉包簡單理解成「定義在一個函數內部的函數」,將函數內部和函數外部鏈接起來的一座橋樑。函數