# 閉包 #
??我的理解:面試時,先說作用域鏈,再說閉包產生的原因,然后是垃圾回收GC,最后說閉包。
???????a.一個函數內部聲明的變量,就是它的私有變量.
???????b.在javascript中特性中,函數是可以訪問它所在作用域鏈的所有變量.
???????c.但函數外部是不能直接訪問函數內部的私有變量
???????D.通過函數內部再嵌套函數,子函數返回父函數的變量,就創建了一個閉包。
閉包的表現形式
??模塊化的本質:是通過函數的局部作用域特性來產生局部上下文來保存局部變量?
??1.函數作為返回值
????????function fn(){
??????????var count = 0;
??????????return function(){??//這句話是重點
?????????????count++;
?????????????console.log(count)
??????????}
???????}
????????var a = fn()
????????a();??//1
????????a();??//2
????????a();??//3
????????a();??//4????//a作為變量,是對fn()的引用,所以fn一直沒被釋放
????????a = fn()?????//對a重新賦值,重新把fn的引用給a 所以中間釋放過
????????a();??//1?????
??2.函數當做參數傳遞
???????
???????????var max = 10;
???????????var fn =function(x){
??????????????if(x>max){
????????????????console.log(x)
??????????????}
???????????}//max是自由變量,在fn定義好后就固定,所以max =10
???????????
???????????function fn1(f){
????????????var max = 100;
????????????f(15);
???????????}
????????
???????????fn1(fn) //15
??3.信息暴露和隱藏
????????
????????function fn(){
?????????var a = 10;
?????????var??b = [1,2,3,4];
?????????var count = 0;
?????????function addCount(){
?????????????count++
?????????};
?????????function getCount(){
????????????return count;
?????????}
????
?????????return {
???????????add:addCount,
???????????get:getCount
?????????}
???????//這里暴露出去的對象,只有兩個方法,而私有變量a 和 b沒有暴露,所以是保密的,可以選擇性的暴露????————模塊化 seajs就是這樣實現
???????}
????????var??a = fn(); //將引用給a
???4.異步回調
???????
???????
????// 閉包——異步回調
?????????function fn(){
?????????????var i = 0;
?????????????window.setInterval(function(){
??????????????????console.log(i++)
?????????????},1000);
?????????????console.log('prevent')???
?????????}
?????????fn()
?????
??????注意:setInterval()是典型的異步,fn在執行后,打印出'prevent',然后應該fn調用完成被銷毀,但是定時器依然在執行,所以fn依然還在。??
???????
轉載于:https://www.cnblogs.com/luowen075/p/6135869.html