ECMAScript 6入門讀書筆記一

let與const

let

也是用來聲明變量,可是不一樣於var,我的理解是它是用來修復var的一些神奇效果,似的變量更加規範,簡單來講let定義的變量就是私有變量,有如下幾點做用安全

  • let聲明的變量只在它所在的代碼塊中生效(即它的塊級做用域中生效)
if (true) {
    let i;
    console.log(i);
}
//console.log(i);  ReferenceError: i is not defined
  • 對於for循環的塊級做用域,當let聲明循環體i時,有兩個特色
  • let聲明的i外部不能被訪問閉包

    for (let i = 0; i < 4; i ++) {
            console.log(i);
        }
    console.log(i);  //i is not defined

    之因此裏面能訪問i,由於for循環子做用域能訪問外部做用code

  • for循環當在子做用域,聲明let i時與循環體i是獨立的對象

    for (let i = 0; i < 4; i ++) {
            let i = 6;
            console.log(i);
        }

    爲何能,簡單說就是i私有了內存

  • 每次循環let都是從新申明的,正由於這樣,就能解決for循環時閉包帶來的問題作用域

    for (let i = 0; i < 4; i ++) {
            setTimeout(function () {console.log(i)}, 100)
        }
    //0 1 2 3
    for (var i = 0; i < 4; i ++) {
            setTimeout(function () {console.log(i)}, 100)
        }
    //4 4 4 4
  • 不存在變量提高,io

    //console.log(i);
    //console.log(typeof i);
    let i;

    都是會報錯的,i is not defined。
    對於let聲明的變量,typeof 再也不是安全形式了,而且該變量必須在聲明後才能使用,在它以前使用那就是暫時的死區console

    function f(x=y,y=2) {};
    f(); //y is not defined
    let x = x; //x is not defined
  • 同一做用域中也不能重複定義for循環

    let i;
    let i;  //報錯
    function f(n) {
        let n
    }
    f();  //報錯

    不一樣做用域能夠重複且各自獨立function

    function f(n) {
       {let n}
    }
  • let聲明的變量不屬於window

    let i = 1;
    console.log(window.i); //undefined

const做用是用來聲明常量

做用和let同樣,但多兩點

  • 一旦聲明必須初始化,也就是必需賦值,不然報錯;

    const P = 1;
  • 一旦賦值不能被改變,其本質是不能改變變量的內存地址
    變量是原始類型的數據,其自己就是不可變的,再加上不能從新賦值,改變地址

    const P = 1;
    P = 2;   //報錯

    變量是對象類型的,其自己是可變的,因此也就能改變,要注意的是其地址並不改變

    const P = {a : 1} ;
    P.a =2;
    console.log(P);  //{a : 2}

    想要其內容也不變,能夠凍結它

    const P = {a : 1} ;
    Object.freeze(P);
    P.a =2;
    console.log(P);
相關文章
相關標籤/搜索