資源描述:
《javascript基礎(chǔ)篇(6)之函數(shù)表達(dá)式閉包_javascript技巧》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫。
1、JavaScript基礎(chǔ)篇(6)之函數(shù)表達(dá)式閉包其實(shí)js支持函數(shù)閉包的主要原因是因?yàn)閖s需要函數(shù)能夠保存數(shù)據(jù)。這里的保存數(shù)據(jù)是只函數(shù)在運(yùn)行結(jié)束以后函數(shù)內(nèi)變量的值也會(huì)進(jìn)行保存。至于為什么js需要在函數(shù)內(nèi)可以保存數(shù)據(jù),那就是js是一種函數(shù)式語言。在函數(shù)內(nèi)保存數(shù)據(jù)是函數(shù)式語言的一大特征。回顧前面介紹過的三種定義函數(shù)方式functiosu(numnumreturnunum//函數(shù)聲明語法定義vasufunction(nunmum)returnunu//函數(shù)表達(dá)式定義vasuneFunction(〃nunT〃numz,,,returnunumz,)//Functio構(gòu)造
2、函數(shù)在分析閉包Z前我們先來看看,定義和調(diào)用函數(shù)容易犯的錯(cuò)誤。例1:saylliO;//錯(cuò)誤:函數(shù)還不存在varsayHi=function(){alert("test");};例2:if(true){functionsayHi(){alert(〃1〃);}}else{functionsayHi(){alert("2");}}saylliO;//打印結(jié)果并不是我們想要的例3:varfiml二functionfun2(){alert("test");fun2();//錯(cuò)誤:函數(shù)還不存在在例1中,我們不能在使用函數(shù)聲明式語法定義之前調(diào)用函數(shù)。解決方案:1.如果使用函
3、數(shù)表達(dá)式定義函數(shù)的話,需要在表達(dá)式定義后調(diào)用。varsaylli=function(){alert("test");};sayHi()2?使用函數(shù)聲明式。(這里瀏覽器引擎會(huì)函數(shù)聲明提升,在所有代碼執(zhí)行之前先讀取函數(shù)聲明)sayHi();functionsayHi(){alert("test");};在例2中,我們預(yù)期的結(jié)果應(yīng)該是打印1,實(shí)際結(jié)果是打印2。if(true){functionsayHi(){alert("1");}}else{functionsaylli(){alert("2");}}sayHi();//打印結(jié)果并不是我們想要的為什么會(huì)這樣?止因?yàn)?/p>
4、函數(shù)聲明提升,所以瀏覽器在預(yù)解析的時(shí)候不會(huì)判斷if條件,直接解析第二個(gè)函數(shù)定義的時(shí)候覆蓋了第一個(gè)。解決方案:varsayHi;if(true){sayHi=function(){alert(T‘);}}else{saylli=function(){alert(〃2〃);}}sayHi();在例3中,發(fā)現(xiàn)只能只用fun1()調(diào)用,而不能使用fun2()調(diào)用。我自己的理解,真正原因不知道。沒找到資料。因?yàn)?:functionfun3(){};等效與varfun3=functionfun3(){};如圖:un3:functionfur)3()arguments:nu
5、llcalle^:null:0圖二debugger;functionvar
6、fun3natre:口ptttpe:fun3proto:function()?innu(rcna所以只能只用funlO調(diào)用,而不能使用fun2()調(diào)用。其實(shí)這里我述是有疑問的?哪位大神知道,望告知。既然,fun2在外面不能調(diào)用為什么在函數(shù)內(nèi)部能調(diào)用?雖然在debugger還是得不到funlo0涵敎乘達(dá)xC.htmlXEDft?UAsync?Servingfromthefilesystem?Addyourfilesintotheworkspace,mone▼Watch丁千uni:〈no
7、七availBbl已〉
8、vCallStackfun1vari=0;.varFun2=-Functionfunl](){ifif#空土debugs?1*i}他n2C);Nev“showK雖然闊試到亦1是不可用的。但罡■在代馮里面還是可以正常嵐疔。(anonymousfunction)▼Scope▼LQC91?this:Window?GlobaL好了,通過上面的三道題目熱身。我們繼續(xù)今犬的主題“閉包”O(jiān)1?什么是閉包?定義:就是冇權(quán)訪問另一個(gè)函數(shù)作用域的變量的函數(shù)我們先從一個(gè)示例函數(shù)開始:例1:functionfun(){vara二"弓長(zhǎng)三〃;}fun();//在
9、我們執(zhí)行完后,變量a就被標(biāo)記為銷毀了例2:functionfun(){vara二〃張三〃;rcturnfunction(){alert("test");}}varf二fun();//同樣,在我們執(zhí)行完后,變量a就被標(biāo)記為銷毀了例3:functionfun(){vara二"張三〃;returnfunction(){alert(a);}varf=fun();//【現(xiàn)在情況發(fā)生變化了,如果&被銷毀,顯然f被調(diào)用的話就不能訪問到變量3的值了】f();//【然后變量a的值正常的被訪問到了】//這就是閉包,當(dāng)函數(shù)A返冋的函數(shù)B里面使用到了函數(shù)A的變量,那么函數(shù)B就使用了閉
10、包。示例:functionfun(){