在局部做用域里面,变量在函数体执行完以后,就会被回收。浏览器
<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>