對于前端人員面試,出現(xiàn)頻率最多也是讓人最頭疼的就是面試官說:“請簡單談一談你對閉包的理解”。對于這一個幾乎快被人問爛的問題,屢屢出現(xiàn)在我們面試或被面試的過程中的原因很簡單--我們一直都在接觸閉包,卻很少去正確地對待它。

因為閉包是因為JS的一些語言特性而形成的,所以在談它之前我們首先要了解一下的知識點

1.執(zhí)行上下文
2.作用域
3.垃圾回收機制
4.函數(shù)嵌套

本文只會簡單的談涉及到的內(nèi)容,如果知識點有遺漏的同學(xué)可以自行g(shù)oogle,接下來讓我們進入正題!

1. 什么是閉包?

關(guān)于什么是閉包讓我們先看看《高級程序設(shè)計》和《JavaScript權(quán)威指南》中的說法:

《高程》: 閉包是指有權(quán)訪問另一個函數(shù)作用域中的變量的函數(shù),創(chuàng)建閉包的常見方式,就是在一個函數(shù)內(nèi)部創(chuàng)建另一個函數(shù)。

《權(quán)威指南》:和其他大多數(shù)現(xiàn)代編程語言一樣,JavaScript也采用詞法作用域,也就是說,函數(shù)的執(zhí)行依賴于變量作用域,這個作用域是在函數(shù)定義時決定的,而不是函數(shù)調(diào)用時決定的。為了實現(xiàn)這種詞法作用域,JavaScript函數(shù)對象的內(nèi)部狀態(tài)不僅包含函數(shù)的代碼邏輯,還必須引用當(dāng)前的作用域鏈。函數(shù)對象可以通過作用域鏈互相關(guān)聯(lián)起來,函數(shù)體內(nèi)部的變量都可以保存在函數(shù)作用域內(nèi),這種特性在計算機科學(xué)文獻中稱為“閉包”。

比較兩種說法《高程》中的說法太過抽象,我比較傾向于《權(quán)威指南》中的說法,現(xiàn)在讓我們剝繭抽絲,一步一步的解釋這種說法。

2. 解釋閉包,掃蕩閉包理解過程中產(chǎn)生的知識點

我們知道“JavaScript中沒有塊級作用域”,所謂“塊”,也就是大括號“{}”中間的語句(但是在ES6中已經(jīng)引入塊級作用域,這里不做討論).我們還知道在JavaScript中,在函數(shù)里面定義的變量,可以在函數(shù)里面被訪問,但是在函數(shù)外無法訪問,這也就形成了函數(shù)作用域,即如下代碼所示

var i = 1;
if(true){
    var j = 2;
}
console.log(i,j) // 1 2


function test(){
    var z = 3;
}

test();
console.log(z); //Uncau
        
		

網(wǎng)友評論