一.閉包函數(shù):
閉包是js中的一大特色,也是一大難點(diǎn)械媒。簡(jiǎn)單來說,所謂閉包就是說,一個(gè)函數(shù)能夠訪問其函數(shù)外部作用域中的變量纷捞。
閉包的三大特點(diǎn)為:
1痢虹、函數(shù)嵌套函數(shù)
2、內(nèi)部函數(shù)可以訪問外部函數(shù)的變量
3主儡、參數(shù)和變量不會(huì)被回收奖唯。
閉包是指有權(quán)訪問另一個(gè)函數(shù)作用域中的變量的函數(shù),創(chuàng)建閉包的最常見的方式就是在一個(gè)函數(shù)內(nèi)創(chuàng)建另一個(gè)函數(shù)糜值,通過另一個(gè)函數(shù)訪問這個(gè)函數(shù)的局部變量丰捷。使用閉包有一個(gè)優(yōu)點(diǎn),也是它的缺點(diǎn)寂汇,就是可以把局部變量駐留在內(nèi)存中瓢阴,可以避免使用全局變量。全局變量在每個(gè)模塊都可調(diào)用健无,這勢(shì)必將是災(zāi)難性的。所以推薦使用私有的液斜,封裝的局部變量累贤。一般函數(shù)執(zhí)行完畢后,局部活動(dòng)對(duì)象就被銷毀少漆,內(nèi)存中僅僅保存全局作用域臼膏。但閉包的情況不同!
代碼示例:
這個(gè)例子中示损,變量a在test方法外部是無法訪問的渗磅,但test方法里面,嵌套了一個(gè)匿名函數(shù)检访,通過return返回始鱼,test作用域中的變量a,可以在匿名函數(shù)中訪問脆贵。并且當(dāng)test方法執(zhí)行后医清,變量a所占內(nèi)存并不會(huì)釋放,以達(dá)到嵌套的函數(shù)還可以訪問的目的卖氨。
javascript的垃圾回收原理:
(1)会烙、在javascript中,如果一個(gè)對(duì)象不再被引用筒捺,那么這個(gè)對(duì)象就會(huì)被GC回收柏腻;
(2)、如果兩個(gè)對(duì)象互相引用系吭,而不再被第3者所引用五嫂,那么這兩個(gè)互相引用的對(duì)象也會(huì)被回收。
那么使用閉包有什么好處呢村斟?使用閉包的好處是:
1.希望一個(gè)變量長(zhǎng)期駐扎在內(nèi)存中
2.避免全局變量的污染
3.私有成員的存在
二.回調(diào)函數(shù)
百度百科:回調(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)败匹。
在JavaScript中,回調(diào)函數(shù)具體的定義為:函數(shù)A作為參數(shù)(函數(shù)引用)傳遞到另一個(gè)函數(shù)B中讥巡,并且這個(gè)函數(shù)B執(zhí)行函數(shù)A掀亩。我們就說函數(shù)A叫做回調(diào)函數(shù)。如果沒有名稱(函數(shù)表達(dá)式)欢顷,就叫做匿名回調(diào)函數(shù)槽棍。
回調(diào)函數(shù)原理:我現(xiàn)在出發(fā),到了通知你”抬驴。這是一個(gè)異步的流程炼七,“我出發(fā)”這個(gè)過程中(函數(shù)執(zhí)行),“你”可以去做任何事布持,“到了”(函數(shù)執(zhí)行完畢)“通知你”(回調(diào))進(jìn)行之后的流程豌拙。
代碼示例:
前段時(shí)間碰到一個(gè)關(guān)于數(shù)組排序公共方法的問題,排序方式(從小到大或從大到刑馀)是調(diào)用該排序方法的人決定按傅。實(shí)現(xiàn)該排序方法可以用回調(diào)來實(shí)現(xiàn),當(dāng)然你可以寫2個(gè)方法胧卤,一個(gè)是從小到大的排序唯绍,一個(gè)是從大到小的排序方法。下面示例代碼就是回調(diào)的典型使用場(chǎng)合:
回調(diào)函數(shù)的適用場(chǎng)合:
資源加載:動(dòng)態(tài)加載js文件后執(zhí)行回調(diào)灌侣,加載iframe后執(zhí)行回調(diào)推捐,ajax操作回調(diào),圖片加載完成執(zhí)行回調(diào)侧啼,AJAX等等牛柒。
DOM事件及Node.js事件基于回調(diào)機(jī)制(Node.js回調(diào)可能會(huì)出現(xiàn)多層回調(diào)嵌套的問題)。