您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關(guān)JavaScript中作用域和閉包是什么的內(nèi)容。小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過(guò)來(lái)看看吧。
JavaScript作用域和閉包
在javascript中,如果對(duì)作用域和閉包弄不清楚,寫代碼就會(huì)出很多問(wèn)題,今天對(duì)作用域和閉包做一個(gè)總結(jié)。
作用域
作用域主要分為全局作用域和局部作用域,其中局部作用域分為函數(shù)作用域和塊級(jí)作用域。
全局作用域
如果你在大括號(hào)({})或者函數(shù)的外面定義了一個(gè)變量,那么它就是一個(gè)全局的變量,它的作用域就是全局作用域。
let a = 1function fun1 () { console.log(a) // 結(jié)果:1 function fun2 () { console.log(a) // 結(jié)果:1 } fun2()}fun1()console.log(a) // 結(jié)果:1
變量a就是定義在最外層,它就能在全局任意地方被使用。
值得注意的是,在同一級(jí)作用域中,使用let或const聲明變量的時(shí)候第二個(gè)同名會(huì)報(bào)錯(cuò),而使用var聲明變量的時(shí)候,會(huì)覆蓋前面的變量;
局部作用域
如果你在函數(shù)或者大括號(hào)({})內(nèi)定義的變量,就是局部作用域的變量,它能夠在該級(jí)作用域級(jí)任意下級(jí)作用域中使用。
function fun1() { let a = 100 console.log(a) // 結(jié)果: 100 function fun2 () { console.log(a) // 結(jié)果:100 } fun2()}fun1()console.log(a) // 結(jié)果: a is not defined
a只能在fun1函數(shù)內(nèi)部包括內(nèi)部函數(shù)中使用,一旦出了fun1的范圍就無(wú)法使用該變量了。
自由變量的查找
一個(gè)變量在當(dāng)前作用域沒(méi)有定義卻被使用了,就是自由變量。它的執(zhí)行規(guī)則是怎樣的呢?
自由變量的查找是向上級(jí)作用域,一層一層以此尋找,直至找到為止。如果全局作用域都沒(méi)有找到,則報(bào)錯(cuò)xx is not defined。
let a = 100function fun1 () { let a1 = 2 function fun2 () { let a2 = 3 let a = 0 function fun3 () { let a3 = 4 a++ console.log(a + a1 + a2 + a3) // 結(jié)果: 10 } fun3() } fun2()}fun1()console.log(a) // 結(jié)果: 100
正如上述代碼所示,在fun3函數(shù)內(nèi),a和a1、 a2都沒(méi)有定義,但被使用了,在執(zhí)行的時(shí)候,它會(huì)往上級(jí)作用域中查找,從而找到它們的值。值得注意的一點(diǎn)的是,在全局作用域和fun2的函數(shù)中我們都定義了a,但是在fun3中使用的fun2中定義的值,外面的使用的全局作用域的值,也就是說(shuō),它往上級(jí)查找的時(shí)候,只要查找到就會(huì)停止查找,會(huì)就近使用。作用域間也不會(huì)互相干擾。(它們里面存在的變量提升和函數(shù)提升可以查看我的另一篇博客有專門的總結(jié))
閉包
閉包是作用域應(yīng)用的特殊情況,主要有兩種表現(xiàn):(1)函數(shù)作為參數(shù)被傳遞。(2)函數(shù)作為返回值被返回。
/** * 函數(shù)作為返回值 */function create () { const a1 = 100 return function () { console.log(a1) }}const fn = create()const a1 = 200fn() // 結(jié)果: 100/** * 函數(shù)作為參數(shù) */function print (fn) { const a2 = 300 fn()}const a2 = 400function fn1 () { console.log(a2)}print(fn1) // 結(jié)果: 400
上面代碼演示了函數(shù)的兩種表現(xiàn),值得注意的是:在閉包中,自由變量的查找,是在函數(shù)定義的地方,向上級(jí)作用域查找,不是在執(zhí)行的地方!
閉包的實(shí)際應(yīng)用場(chǎng)景
(1)隱藏?cái)?shù)據(jù), 如做一個(gè)簡(jiǎn)單的cache工具
(2)函數(shù)防抖與節(jié)流
感謝各位的閱讀!關(guān)于“JavaScript中作用域和閉包是什么”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。