iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 11
0
自我挑戰組

新手初探 Vue系列 第 20

鐵人賽Day21 - ES6 之 let 和 const

  • 分享至 

  • xImage
  •  

接下來的篇幅會開始寫關於 ES6 的部分,首先先從變數的宣告下手,在以往我們都是使用 var 來宣告變數
先來講 let 的部分,假設今天我們的程式碼如下:

console.log(mom);
var mom = '老媽';
(function () {
  console.log(mom);
})();

這時候會依序輸出:
undefined
老媽
但如果我們把 var 改成 let,輸出就會錯誤,這是因為 var 宣告時,已經在記憶體佔了一個位置,只是我們還沒賦予值,所以第一次在 console 的時候才會顯示 undefined 而當第二行我們賦予值的時候才被輸出出來,但是 let 宣告的話,依序從上而下,還沒有發現宣告的變數賦予值,所以才會出現錯誤

第二種情況,是作用域的部分:

function varMing () {
  var ming = '小明';
  if (true) {
    var ming = '杰哥';  
  }
  console.log(ming);
}
varMing();

這時候在 console 輸出會出現杰哥,但是如果改成 let 宣告的話,輸出就會是小明,並不會被 if 的判斷式取代掉
var 的作用域是 function scope
let 的作用域是 block
簡單來說 let 的作用域是 {} 大括號之間的部分

第三種情況是 for 迴圈的時候,宣告變數 i 的時候:

for (var i = 0; i < 10; i++) {
  console.log(i);
  setTimeout(function () {
    console.log('這執行第' + i + '次');
  }, 10);
}

在這樣的情況下,console 會直接輸出,這執行第 10 次,並不是我們預期的,這執行第 1 次,這執行第 2 次,這執行第 3 次....
這是因為 i 已經被宣告為全域變數了,他會在迴圈內累加之後再輸出,我們在 console 內輸入 window.i 就會發現有數字輸出,如果改成 let 宣告 i 變數,就會發現結果如我們所預期,這是因為 let 的作用域是 block 是在 {} 之間,且在 console 輸入 window.i 就會是 undefined

接著我們來說明 const:

const ming = '鐵錚錚男子漢';

當我們宣告一個變數使用 const 的時候,就不能去改動它的值,這會出現錯誤,如果這時候我們把 ming 改成其他的內容:

ming  = '男子漢';

就會發現在 console 會跳錯,但是如果是更改物件的屬性呢:

const family = {
  mom: '老媽',
  me: '小明',
  sister: '小橙'
};
family.father = '爸爸';

會發現是可以的,因為物件的屬性是傳參考特性就不影響,如果把宣告的物件改成空物件,這時候就會出錯了

2020/06/22 補充:
var 宣告的變數,往往都會是全域變數,進而會影響到開發,舉個例子:
在 for 迴圈的時候,或者 if 判斷式的時候

// for 迴圈
for(var i=0; i<10; i++){
    console.log(i);
}
console.log(i);

// if 判斷式
if(true){
    var feedBack = '同意';
}
console.log(feedBack);

在上述兩種情況,會發現在 for 迴圈外和 if 判斷式外,用 console 查看在內部宣告的變數,仍然可以看到,這是因為 var 宣告的變數為全域,為了讓變數可以在 {} 的作用域內,這時候就可以採用 let 來做宣告

假設沒有 let 的情況下,該如何解決既有的這個問題? 可以採取立即函式!

(function(){
    for(var i=0; i<10; i++){
        console.log(i);
    }
}());

console.log(i);

這時候 console 就會跳錯,這也是為了限制作用域的部分 ~


上一篇
鐵人賽Day20 - slot 插槽
下一篇
鐵人賽Day22 - ES6 之展開與其餘
系列文
新手初探 Vue30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言