在局部做用域裏面,變量在函數體執行完以後,就會被回收。瀏覽器
<script> function func(){ var x = 1; console.log(x); // 變量x在函數執行完畢後,會被回收 }; func(); // 1 console.log(x); // x is not defined </script>
能夠訪問其餘函數做用域裏變量或者參數的函數(閉包會形成局部變量不被銷燬)。閉包
<script> (function(){ var x = 1; console.log(x) })();//這不是一個閉包,這只是一個函數表達式的自執行 function fn(){ var y = 2; return y; //能夠獲取內部函數的變量,但不是閉包 }; var b = fn(); console.log(b); var m = 1; function func1(){ var m =10; return function(){ m++; console.log(m); } } var n = func1(); n(); // 11 </script>
建立閉包:一個函數裏面嵌套一個函數,內部函數引用外部函數的變量或者參數函數
<div>11</div> <div>22</div> <div>33</div> <div>44</div> <div>55</div> <script> var boxes= document.getElementsByTagName("div"); len = boxes.length; // 建立閉包須要兩個函數 for(var i = 0; i < len; i++){ // 閉包寫法一 func1(i); function func1(index){ boxes[index].onclick = function(){ console.log(index); } } // 閉包寫法二 (function(index){ boxes[index].onclick = function(){ console.log(index); } })(i) // 自執行中帶參數 } </script>