//例子1 var a = 10086; function f1() { alert(a); } f1(); //999 //例子2:函數內部變數聲明的時候,必須要用var 否則實際是聲明了一個全域變數 function f2() { var b = 10086; } f2(); alert(b); //errer :b為定義 //例子3:例如c為全域變數 function f3() { c = 10086; } f3(); alert(c);// //========================== //例子2情況 我們需要訪問b的值的時候怎麼辦呢 //這個時候f4內的所有變數對於getd都是可見的,但getd中的變數對f4卻不可見 ,這樣我們的f4函數就形成了閉包了。 //例子4 function f4() { var d = 10000; function getd() { alert(d); } return getd(); } // 閉包的定義:簡單的可以理解為定義在函數內部的函數// 閉包的用途:讀取函數內部的變數,讓變數的值保持在記憶體中 //例子5 function f5() { var n = 100086; Add = function () { n += 1 }; function getn() { alert(n); } return getn; } //這樣調用的時候不會出現閉包的情況 f5();//這裡輸出10086 Add(); f5();//10086 //用fun變數,形成閉包 var fun = f5();//使用fun指向getn fun(); Add(); fun(); //當執行 var fun=f5() 時,變數fun實際指向了函數getn,getn中用到了變數n //當函數f5內部的函數getn被函數a外部變數引用的時候,就建立了一個閉包 //閉包的作用:在a執行完後並返回,閉包由於變數n被外部參考,導致資源不會被回收,所以n始終存在,如果我們返回的不是getn,那麼n的值不會被調用,就會被回收
參考文章
揭開Javascript閉包的真實面目
學習Javascript閉包(Closure)