ES6指北【1】——let、const

bluesboneW發表於2019-02-16

1.如何學習ES6

1.1 js的學習順序

ES5 -> ES6 -> ES7 -> ES8 以此類推

ES5沒學好就別想學好ES6

1.2 邊學邊用

學了就要用

2.變數宣告的方式

    a = 1
    var a = 1
    // 上面兩個是ES3的語法,下面兩個是ES6的語法
    let a = 1
    const a = 1

2.0 塊級作用域 {}

看mdn

2.1 a = 1 會宣告一個全域性變數 嗎?

    var a

    function fn1() {
        var a
        fn2

        function fn2() {
            a = 1
            console.log(window.a) // undefined
        }
    }

    fn1()

顯然 當var宣告瞭全域性變數後,a = 1 是無法再宣告全域性變數的,只能對其賦值
結論:a = 1 含義不明

2.2 var 的問題

    function fn() {
        if (true) {
            console.log(a) // undefined
        } else {
            // 下面的程式碼不會執行
            var a
            console.log(a)
        }
    }

    fn()

哪怕var沒有被執行,變數也會被提升
也就是說 var宣告的變數沒有塊級作用域 , 而js程式設計師為了讓var有塊級作用域,通常使用的方式是立即執行函式

所有的var建議寫在第一行 —— 《js語法精髓》

2.3 let

2.3.1 let的由來

下面我我們來寫段程式碼
目的是隻暴露一個全域性變數 blues
用var來寫
1.需要一個立即執行函式 2.需要一個函式把a包起來

    (
        function () {
            var a = 1

            window.blues = function () {
                console.log(a) // 1
            }
        }
    )()

用let來寫

    {
        let a = 1
        window.blues = function () {
            console.log(a) // 1
        }
    }
    blues()
    console.log(a) // a is not defined

let 的特點

  1. let的作用域在最近的 {} 之間
  2. let不能重複宣告【。。就算用var也不會有人重複宣告把^_^】
  3. 使用let宣告的變數在塊級作用域內能強制執行更新變數【看mdn最後一個for迴圈例子
  4. let的臨時死區【temp dead zone】—— 如果你在 let a 之前使用a,報錯
    {
        let a = 1
        {
            console.log(a) // a is not defined
            let a = 2
        }
    }
    // 這培養了我們一個好習慣 —— 所有的變數宣告都要寫在前面

test

if (true) {
    let a = 1
} else {
    let a = 2
}
console.log(a) // ???

// answer:a is not defined

簡單理解let —— let就看它在哪個花括號裡

2.4 const

const和let一樣,只有一個區別 —— 只有一次賦值機會,且必須在宣告的時候就賦值
const:英文意思 常量 —— 固定一個值

    {
        const a = 1
        console.log(a) // 1
        a = 2
        console.log(a) // 報錯 —— Assignment to constant variable.[給常量賦值(是錯的)]
    }

用const的情況

    {
        const PI = 3.1415926
    }

3.let的擴充套件

用let解決for迴圈中onclick問題

HTML部分

<ul>
    <li>導航1</li>
    <li>導航2</li>
    <li>導航3</li>
    <li>導航4</li>
    <li>導航5</li>
    <li>導航6</li>
</ul>

JS部分

先看用var來寫

    var liTags = document.querySelectorAll(`li`)

    for (var i = 0; i < liTags.length; i++) {
        // 使用立即執行函式,var j 就不會跑到外面去(不會被提升)
        (function () {
            var j = arguments[0]
            liTags[j].onclick = function () {
                console.log(j)
            }
        })(i)
    }

mdn的寫法

    for (let i = 0; i < liTags.length; i++) {
        // 注意i的作用域就在上面的 () 裡
        // 不過for迴圈在使用let的時候自動做了一個魔法
        // let j = i // js自動加的

        // 過程是這樣的
        // 下面這3行程式碼執行之前 —— 塊裡面的i = ()裡面的i
        liTags[i].onclick = function () {
            console.log(i)
        }
        // 上面3行程式碼執行後 —— ()裡面的i = 塊裡面的i
    }

如果我的解釋你看不懂的話,希望你能看懂下面的程式碼

    for (var _i = 0; _i < liTags.length; _i++) {
        let j = _i
        liTags[j].onclick = function () {
            console.log(j)
        }
    }

4.永遠別再用var了:)

相關文章