溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

JavaScript中作用域和閉包是什么

發(fā)布時(shí)間:2021-01-30 09:42:39 來(lái)源:億速云 閱讀:239 作者:小新 欄目:web開(kāi)發(fā)

這篇文章給大家分享的是有關(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ò),可以把它分享出去讓更多的人看到吧!

向AI問(wèn)一下細(xì)節(jié)

免責(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)容。

AI