// 函數閉包
/*
*閉包函數是指有權訪問另外一個函數做用域中的變量的函數,
* 建立閉包函數最多見的方式是在一個函數內建立另外一個函數,經過另外一個函數訪問這個函數的局部變量
* 閉包的特色:1函數嵌套函數,
* 2 函數內部能夠引用外部的參數和變量
* 3 參數和變量不會被垃圾回收機制回收
* 閉包的優勢:1 但願一個變量長期駐紮在內存中
* 2 避免全局變量的污染
* 3 私有變量存在
* 閉包的實現 1:函數嵌套函數
* 2 外層函數返回內層函數
* 3 外面有一全局變量接受外層函數
* */javascript
function fun1() { var sum=0; function fun2() { sum++; return sum } return fun2 } var s=fun1(); console.log(s()); console.log(s()); console.log(s()); s=null; console.log(s);
執行結果:java
回調函數也是閉包es6
for(var i=0;i<6;i++){ setTimeout(function(){ console.log(i) },i*1000) }
執行結果:閉包
每一秒打印一個6,setTimeout是異步的,for循環出6個setTimeout,等全部同步執行以後,在執行setTimeout裏面的內容,此時全局的i已經變成了6異步
要獲得預期效果,每一秒打印一個i,能夠使用閉包當即執行函數。也能夠把var改爲let,利用es6塊做用域函數
當即執行函數:讓函數成函數表達式spa
要想當即執行函數能作到當即執行,要注意兩點,一是函數體後面要有小括號(),二是函數體必須是函數表達式而不能是函數聲明。code
()!= + - void 均可以使函數成爲當即執行函數blog
(function(test){ console.log("test=",test) })(1) !function(test){ console.log("test=",test) }(2) +function(test){ console.log("test=",test) }(3) -function(test){ console.log("test=",test) }(4) let fn=function(test){ console.log("test=",test) }(5) void function(test){ console.log("test=",test) }(6)