文章出處

  (聲明, 本文的所有代碼均在node的最新穩定版本v4.4.3中執行的, 如果在瀏覽器中執行請把JS的運行環境提升為ES6)

  以前一直用var定義變量, 現在有了兩種新的定義變量的方式, 1: let, 2: const;本文大概概括下使用letconst定義變量有哪些好處;

  let:

    1:聲明提前

  使用var聲明變量,存在聲明提前的問題, 輸出的tmp為"undefined":

{
    var tmp = new Date();

    let f = function (){
        console.log(tmp); //undefined
        if (false){
            //使用var聲明變量的聲明提前;
            var tmp = "hello world";
        }
    }

    f();
}

  如果我們把定義tmp的方式改為let呢? 那么tmp輸出的結果為當前的日期。

{
    var tmp = new Date();

    let f = () => {
        console.log(tmp); //輸出的結果為當前的日期
        if (false){
            //使用let的方式聲明, tmp的作用域只有在離他最近的一個{}括號中;
            let tmp = "hello world";
        }
    }

    f();
}

    2:塊狀作用域

  letconst不但擁有塊狀作用域, 還也不存在聲明提前這個玩意兒, 以下代碼會報ReferenceError

{
    let tmp = 123;
    {
        tmp = 234;
        let tmp = 456;
    }
}

 

  使用let聲明的元素作用域更加明確, 不會出現作用域混亂的情況, 可以減少bug的產生;

{
    let foo = 0;
    {
        let foo = 1;
        foo = 2;
    }
    console.log(foo);
}

  以上這段代碼相當于是IIFE(立即執行函數表達式), 效果和以下的相同;

{
    var foo = 0;
    (function(){
        var foo = 1;
        foo = 2;
    }());
    console.log(foo);
}

  再來猜猜這個的結果是什么,( var 形式聲明的變量會提升到{}外面去哦 , {}形式的塊狀作用域相當于是if(true){//code}的寫法):

{
    var foo = 0;
    {
        var foo = 1;
        foo = 2;
    }
    console.log(foo);
}
View Code

    3:重復聲明

  使用let聲明的變量不能重復聲明,否則會出現一下錯誤:

SyntaxError: Identifier 'a' has already been declared

 

 

  注意: 在全局下用let聲明變量和用var聲明變量還是有區別的:

<!DOCTYPE html>
<html>
<head>
    <title></title>
    <meta charset="utf-8"/>
</head>
<body>
<script>
    "use strict";
    let foo = 1;
    console.log(window.foo); //輸出 undefined
    var bar = 1;
    console.log(window.bar); //輸出1
</script>
</body>
</html>

 

  const:

  使用const定義的常量, 而且定義一次以后不能再進行更改, 否者會報錯;

  使用const定義的常量, 擁有let一樣的特性(無聲明提前有塊狀作用域, 重復聲明);

  但是要注意, 如果給常量定義的是對象,只要該對象指向在內存中的地址不發生改變, 數據可以隨便改的(這涉及到計算機的傳值和傳址);

  對象:

{
    const foo = {};
    foo.bar = 1111;
    console.log(foo.bar);
}

  數組:

{
    const foo = [];
    foo.push(1);
    foo.push(2);
    console.log(JSON.stringify(foo));
}

 

  這些新語法讓JS更加規范, 也更加適合大項目, 我仿佛猜到以后要用private和public聲明變量了....( ╯□╰ )

  參考:

  阮一峰:http://es6.ruanyifeng.com/#docs/let

  https://github.com/DrkSephy/es6-cheatsheet#var-versus-let--const

作者: NONO
出處:http://www.cnblogs.com/diligenceday/
QQ:287101329
微信:18101055830 


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()