<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Js變量:var,let,const三個關(guān)鍵字的區(qū)別

          共 1367字,需瀏覽 3分鐘

           ·

          2020-11-08 04:45

          來源 |?http://www.fly63.com/article/detial/9697?type=2


          var在ECMAScript的所有版本中都可以使用,而const和let只能在ES6及更晚的版本中使用。

          var,let,const三個關(guān)鍵字的區(qū)別

          var:

          1)聲明作用域:在函數(shù)內(nèi)部,使用var定義一個變量(局部變量),在函數(shù)被調(diào)用完之后,該變量會被立即銷毀。在定義變量時如果省略var,就會創(chuàng)建一個全局變量(不建議在局部作用域中定義全局變量,難維護(hù),而且在嚴(yán)格模式下,會導(dǎo)致拋出ReferenceError)。

          2)聲明提升:把所有變量聲明都拉到函數(shù)作用域的頂部。

          function foo(){ console.log(age); var age = 18;}

          等價于

          function foo(){ var age; console.log(age); age = 18;}foo();//undefined

          3)可以反復(fù)多次使用var聲明同一個變量。

          function foo(){var age = 16;var age = 1;var age = 2;console.log(age);}foo();//2

          4)全局聲明:使用var在全局作用域中聲明的變量會成為window對象的屬性。

          var age = 18;console.log(window.age);//18

          let:

          1)聲明作用域:let聲明的是塊作用域,而var聲明的是函數(shù)作用域。塊作用域是函數(shù)作用域的子集,所以var作用域的限制同時也適用于let。

          //varif(true){ var age = 18; console.log(age);//18}console.log(age);//18
          //letif(true){ let age = 18; console.log(age);//18}console.log(age);//ReferenceError:age沒有定義

          2)聲明提升:let聲明的變量不會在作用域中被提升

          3)不可以在一個塊中反復(fù)多次使用let聲明同一個變量

          let age;let age;//SyntaxError,標(biāo)識符age已經(jīng)聲明過了

          4)全局聲明:使用let在全局作用域中聲明的變量不會成為window對象的屬性,但是var聲明的變量會。

          let age = 18;console.log(window.age);//undefined

          5)條件聲明:在使用var聲明變量時,由于聲明會被提升,js會自動將多余的聲明在作用域頂部合并為一個聲明。而因為let的作用域是塊,所以不可能檢查前面是否已經(jīng)使用let聲明過同名變量。因此對于let,不能依賴條件聲明模式。

          6)for循環(huán)中的let聲明:在用let聲明迭代變量時,js在后臺會為每個迭代變量聲明一個新的迭代變量,每個setTimeout引用的都是不同的迭代變量。for-in 和for-of都適用。

          for(var i=0;1<5;i++){}console.log(i); //5
          for(let i=0;1<5;i++){}console.log(i); //ReferenceError:i沒有定義

          for(var i=0;1<5;i++){ setTimeout(()=>console.log(i),0);}//會輸出5,5,5,5,5
          for(let i=0;1<5;i++){ setTimeout(()=>console.log(i),0);}//會輸出0,1,2,3,4

          const:

          1)const的行為和let基本相同,唯一的區(qū)別是const它聲明變量時必須同時初始化變量,且嘗試修改const聲明的變量會導(dǎo)致運(yùn)行時錯誤(TypeError)。

          2)不允許重復(fù)聲明

          3)作用域也是塊

          4)const聲明的限制只適用于它指向的變量的引用。換句話說,如果const變量引用的是一個對象,那么修改這個對象內(nèi)部的屬性并不違反const的限制。

          const person = {};person.name = "QiuYing";

          5)不能用const聲明迭代變量,因為迭代變量會自增。但是可以聲明一個不會被修改的for循環(huán)變量。這對for-in 和for-of循環(huán)特別有意義。

          ?聲明風(fēng)格及最佳實踐:先使用const,let次之,不使用var。


          瀏覽 67
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  日韩蜜桃久久久 | 北条麻妃黄色视频免费播放 | chengrenavyingyin | 国产美女被鸡巴操 | 亚洲理论在线观看 |