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

一個關(guān)于let塊級作用域的問題,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 中報錯:

ReferenceError: Can't find variable: nameSet

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

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

有沒有大神可以解釋下..safari下為何報錯?

回答
編輯回答
幼梔
        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ù)聲明不要寫在條件語句中,拿出來

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

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

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

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

2017年1月26日 12:20