1、回調(diào)函數(shù)
??? 一個(gè)通過函數(shù)指針調(diào)用的函數(shù)壕探。如果你把函數(shù)的指針(地址)作為參數(shù)傳遞給另一個(gè)函數(shù)冈钦,當(dāng)這個(gè)指針被用來調(diào)用其所指向的函數(shù)時(shí),我們就說這是回調(diào)函數(shù)李请∏粕福回調(diào)函數(shù)不是由該函數(shù)的實(shí)現(xiàn)方直接調(diào)用厉熟,而是在特定的事件或條件發(fā)生時(shí)由另外的一方調(diào)用的,用于對(duì)該事件或條件進(jìn)行響應(yīng)较幌。
??? 在JS中揍瑟,可以理解為函數(shù)A作為參數(shù)(函數(shù)引用)傳遞到另一個(gè)函數(shù)B中,并且這個(gè)函數(shù)B執(zhí)行函數(shù)A乍炉。我們就說函數(shù)A叫做回調(diào)函數(shù)绢片。如果沒有名稱(函數(shù)表達(dá)式),就叫做匿名回調(diào)函數(shù)岛琼。而Ajax的異步加載時(shí)用到了回調(diào)函數(shù)的底循,但其實(shí)回調(diào)不僅僅是用在異步中,同步操作也可以使用:
??? 異步的情況也很多:
2槐瑞、閉包
? 1)什么是閉包熙涤?
??????? 能夠讀取其他函數(shù)內(nèi)部變量的函數(shù)。在javascript中困檩,只有函數(shù)內(nèi)部的子函數(shù)才能讀取局部變量祠挫,所以閉包可以理解成一個(gè)“定義在函數(shù)內(nèi)部的函數(shù)”。創(chuàng)建閉包的最常見的方式就是在一個(gè)函數(shù)內(nèi)創(chuàng)建另一個(gè)函數(shù)窗看,通過另一個(gè)函數(shù)訪問這個(gè)函數(shù)的局部變量茸歧。使用閉包有一個(gè)優(yōu)點(diǎn),也是它的缺點(diǎn)显沈,就是可以把局部變量駐留在內(nèi)存中软瞎,可以避免使用全局變量。
??????? Javascript 中拉讯,每個(gè)函數(shù)都有一個(gè)與之相關(guān)聯(lián)的作用域鏈涤浇。每次調(diào)用 JavaScript函數(shù)的時(shí)候,都會(huì)為之創(chuàng)建一個(gè)新的對(duì)象用來保存局部變量魔慷,并把這個(gè)對(duì)象添加至作用域鏈中只锭。當(dāng)函數(shù)返回時(shí),再將這個(gè)對(duì)象刪除院尔,此對(duì)象會(huì)被當(dāng)做垃圾回收蜻展。但如果這個(gè)函數(shù)定義了嵌套的函數(shù),并將它存儲(chǔ)在某處的屬性里邀摆,就意味著有了一個(gè)外部引用指向這個(gè)嵌套的函數(shù)纵顾。它就不會(huì)被當(dāng)作垃圾回收贼穆,它所指向的變量綁定對(duì)象同樣不會(huì)被回收鳞尔。
? 2)閉包特性
??????? a纹坐、函數(shù)嵌套函數(shù)
??????? b糖声、.函數(shù)內(nèi)部可以引用外部的參數(shù)和變量
??????? c符喝、參數(shù)和變量不會(huì)被垃圾回收機(jī)制回收
? 3)例子
foo函數(shù)中形成了一個(gè)閉包匾鸥,只要bar函數(shù)在数尿,垃圾回收機(jī)制就不會(huì)去動(dòng)foo函數(shù)被冒,而此時(shí),我們的bar函數(shù)所指向的那個(gè)匿名函數(shù)就可以一直去訪問那個(gè)number和x蠕搜,而且每次調(diào)用怎茫,都會(huì)得到上一次被自增了以后的number。