iT邦幫忙

1

JS學習紀錄-07 - 宣告變數 - let、const、var

  • 分享至 

  • xImage
  •  

嗨嗨~我是914 今天也來學習宣告變數 - let、const、var囉GOGOGO

我的天~好吧我一直有點逃避這塊:)
來個崩潰15秒(一般的5倍)
今天來寫一下~一直說要發文的這個主題
QQ 如果真的有什麼錯誤~再麻煩各位大神指教了

前情提要&重要事項
1.變數提升
變量和函數的聲明會在編譯階段被移動到其所在作用域的頂部。也就是說可以在變量和函數被聲明之前使用它們。但不同的聲明方式 (var, let, const, 以及函數) 的提升行為是不同的
2.這個面試好像蠻常考到的,我也不曉得為甚麼一直死在這塊(?)
3.下面會有補充實例的部分


剛開始先來提一下用這三個做宣告的部分
宣告

let 宣告一個可以重新賦值得變數

let message = "Hello";
message = "World";
console.log(message); // World

const 宣告一個不可重新賦值的常數

const number = 10;
// number = 20; // TypeError: Assignment to constant variable.
const array = [1, 2, 3];
array.push(4);
console.log(array); // [1, 2, 3, 4]

var 宣告一個可隨意更改其內容的變數

var counter = 1;
counter = 2;
console.log(counter); // 2

var

  • 作用域:var 是函數作用域(function-scoped)。用 var 聲明的變量在其定義的函數內部是可見的,如果是在全局範圍內聲明的,則在整個程序中都可見。

  • 變量提升:var 變量會被提升(hoisted)到其作用域的頂部。這意味著變量可以在其聲明之前使用,不過值為 undefined。

  • 重新賦值:可以多次重新賦值,也可以重新聲明。

console.log(x); // undefined
var x = 5;
console.log(x); // 5

function foo() {
  var y = 10;
  if (true) {
    var y = 20; // 同一個變量
    console.log(y); // 20
  }
  console.log(y); // 20
}
foo();

let

  • 作用域:let 是塊作用域(block-scoped)。用 let 聲明的變量在其定義的塊內部是可見的(例如 {})。

  • 變量提升:let 變量會被提升到塊的頂部,但在聲明之前不能使用

  • 重新賦值:可以重新賦值,但不能在相同的作用域內重新聲明。

console.log(a); // ReferenceError: a is not defined
let a = 10;
console.log(a); // 10

function bar() {
  let b = 1;
  if (true) {
    let b = 2; // 不同的變量
    console.log(b); // 2
  }
  console.log(b); // 1
}
bar();

const

  • 作用域:const 也是屬於塊作用域(block-scoped)

  • 變量提升:const 變量會被提升到塊的頂部,但在聲明之前不能使用

  • 重新賦值:const 用於聲明常量,必須在聲明時初始化,且不能重新賦值。不過,對於對象和陣列,

  • const 允許改變內容(如同下面舉例:改變陣列跟對象屬性)

const c = 30;
console.log(c); // 30
c = 40; // TypeError: Assignment to constant variable(不能夠重新賦值)

const d = [1, 2, 3];
d.push(4); // 可以改變陣列內容
console.log(d); // [1, 2, 3, 4]

const e = { name: 'Alice' };
e.name = 'Bob'; // 可以改變對象屬性
console.log(e); // { name: 'Bob' }

補充舉例-作用域 (scope)的差異

這部分我參考這篇文章,算是對新手相當友善的文章~
點我開啟友善的文章

作用域不一樣,var 是 function scoped,而 let 和const 是 block scoped (block 意指 {} 這個符號)。
這三點有作用域的差異,

var

function testVar() {
    {
        var x = 10;
        // console.log(x); // 10  在{}內可見
    }
    console.log(x); // 10 - 在{}外也可見,因為 var 是函式作用域
}

testVar();

let

function testLet() {
    {
        let y = 20;
        // console.log(y); // 20 - 在塊內可見
    }
    console.log(y); // y is not defined  ReferenceError - 在塊外不可見,因為 let 是塊級作用域
}
testLet();

const

function testConst() {
    {
        const z = 30;
        console.log(z); // 30 - 在塊內可見
    }
    // console.log(z); // ReferenceError - 在塊外不可見,因為 const 是塊級作用域
}

testConst();

綜合的實體舉例

function testMixed() {
    {
        var a = 1;
        let b = 2;
        const c = 3;
        console.log(a); // 1 - 在塊內可見
        console.log(b); // 2 - 在塊內可見
        console.log(c); // 3 - 在塊內可見
    }
    console.log(a); // 1 - 在塊外可見,因為 var 是函式作用域
    // console.log(b); // ReferenceError - 在塊外不可見,因為 let 是塊級作用域
    // console.log(c); // ReferenceError - 在塊外不可見,因為 const 是塊級作用域
}

testMixed();

結論

  • 作用域:var 是函數作用域,let 和 const 是塊作用域。
  • 變量提升:var 變量會被提升,let 和 const 變量也會被提升,聲明之前不能使用。
  • 重新賦值:var 可以重新賦值和重新聲明,let 可以重新賦值但不能重新聲明,const 不能重新賦值(但可以改變對象和陣列的內容)。

我是超級新手,若有任何建議或是錯誤的部分,歡迎底下留言唷thanks
我們下篇文章見掰掰~

對自己多用點心,日益努力,而後風生水起。盡情玩耍,盡情學習,盡情熱愛,盡情討厭,在需要的時候釋放善意,在必要的時候展現強硬,把這不得不過完的一生,變成值得慶賀的一生。


參考資料
https://jenniferwu617.medium.com/javascript%E7%AD%86%E8%A8%98-const-let-var-%E5%B7%AE%E7%95%B0-10a09397dda8
https://ithelp.ithome.com.tw/articles/10209121?source=post_page-----10a09397dda8--------------------------------
https://medium.com/%E5%B0%8F%E5%BD%A5%E5%BD%A5%E7%9A%84%E5%89%8D%E7%AB%AF%E4%BA%94%E5%9B%9B%E4%B8%89/var-let-const-%E6%90%9E%E5%BE%97%E6%88%91%E5%A5%BD%E4%BA%82%E5%91%80-a338912f45c5
https://ithelp.ithome.com.tw/articles/10240708
https://developer.mozilla.org/zh-TW/docs/Glossary/Hoisting#%E4%BA%86%E8%A7%A3%E6%9B%B4%E5%A4%9A


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言