阮一峰的網(wǎng)絡(luò)日志-學(xué)習(xí)Javascript閉包(Closure)
David Flanagan-JavaScript權(quán)威指南(第6版)
Douglas Crockford-JavaScript語(yǔ)言精粹
說(shuō)明:文章主要部分轉(zhuǎn)載自阮一峰的博客內(nèi)容,權(quán)威指南和語(yǔ)言精粹,少量為個(gè)人理解
一,變量的作用域
1,JS的函數(shù)內(nèi)部可以直接讀取全局變量;
2,函數(shù)內(nèi)部聲明變量的時(shí)候,如果不使用var命令,實(shí)際上是聲明了一個(gè)全局變量;
3,在函數(shù)外部無(wú)法讀取函數(shù)內(nèi)的局部變量
測(cè)試代碼1.png
運(yùn)行結(jié)果.png
二 如何從外部讀取局部變量?
有時(shí)候,需要得到函數(shù)的內(nèi)部變量,
可以在函數(shù)f1的內(nèi)部,定義一個(gè)嵌套函數(shù)f2,此時(shí)f2中可以訪問(wèn)f1中的變量
(JS語(yǔ)言特有的鏈?zhǔn)阶饔糜騝hain scope, 子對(duì)象會(huì)一級(jí)一級(jí)向上尋找所有父對(duì)象的變量,父對(duì)象的所有變量對(duì)于子對(duì)象都是可見的,反之不成立),
將f2作為返回值,可以在f1外部讀取f2的內(nèi)部變量
測(cè)試代碼2.png
測(cè)試結(jié)果2.png
三 閉包的概念
第二節(jié)中的f2函數(shù),就是閉包
各種專業(yè)文獻(xiàn)中的closure定義非常抽象,我的理解是(引用一中的作者)-閉包就是能夠讀取其他函數(shù)內(nèi)部變量的函數(shù)
由于在JS中,只有函數(shù)內(nèi)部的子函數(shù)可以讀取局部變量,可以把閉包簡(jiǎn)單的理解成--定義在函數(shù)內(nèi)部的函數(shù)
本質(zhì)上,閉包就是將函數(shù)內(nèi)部和函數(shù)外部連接起來(lái)的一座橋梁
四 閉包的用途
閉包可以用在很多的地方,最大的用處是(1)可以在函數(shù)外部讀取到函數(shù)內(nèi)部的變量,(2)可以讓變量的值始終保持在內(nèi)存中
下面的代碼中,result實(shí)際上就是閉包f2函數(shù),一共執(zhí)行了兩次,這