鍍金池/ 問(wèn)答/網(wǎng)絡(luò)安全  HTML/ 一個(gè)關(guān)于let塊級(jí)作用域的問(wèn)題,safari和Chrome下表現(xiàn)不一致

一個(gè)關(guān)于let塊級(jí)作用域的問(wèn)題,safari和Chrome下表現(xiàn)不一致

如題,先上代碼:

if(1===1) {
    let nameSet = new Set();

    if (1 === 2) {
        // do nothing
    }
    else {

        function getArrayFromOl() {
            console.log('nameSet:', nameSet)
        }

        getArrayFromOl()
    }
}

這段代碼在 safari 11.0.3 中報(bào)錯(cuò):

ReferenceError: Can't find variable: nameSet

但是在 Chrome 中卻能訪問(wèn)到相關(guān)變量。

我認(rèn)為也應(yīng)該能訪問(wèn)到相關(guān)變量...

有沒(méi)有大神可以解釋下..safari下為何報(bào)錯(cuò)?

回答
編輯回答
幼梔
        if (1 === 1) {
            let nameSet = new Set();
            if (1 === 2) {
                // do nothing
            } else {
                console.log(nameSet)
                getArrayFromOl(nameSet)
                
                function getArrayFromOl(nameSet) {
                    console.log(nameSet)
                }
            }
        }

ps:函數(shù)聲明不要寫(xiě)在條件語(yǔ)句中,拿出來(lái)

補(bǔ)充:
問(wèn)題主要原因是chrome和safari對(duì)于函數(shù)在條件語(yǔ)句中聲明表現(xiàn)不一致導(dǎo)致的??梢杂靡韵麓a驗(yàn)證

        test1() 
        if (true) {
            if (false) {

            } else {
                function test1() {
                    console.log('test') // chrome中報(bào)錯(cuò),safari中打印出`test`
                }
            }
        }

而題主的問(wèn)題原因是:在safarigetArrayFromOl函數(shù)相當(dāng)與已經(jīng)提升到最外層的if之外,而nameSet由于是let聲明,所以作用域在第一個(gè)if內(nèi),所以getArrayFromOl取不到相應(yīng)的值

2017年1月26日 12:20