Category: Front-End JavaScript

JavsScript一些奇怪的點與我寫得時候會出現的疑問。

  • JS 作用域探討

    語法作用域 = 靜態作用域

    靜態作用域 及 動態作用域 之間的差別牽涉直譯語言的解譯及運行流程。
    • 資料參考: 六角學院 JavaScript 核心篇

    變數作用域也會依據宣告的方式不同,產生不同的作用域:
    未宣告:全域變數
    var 宣告:作用域在 函式 中
    letconst 宣告:作用域在 {} 中

    JS 採用的是語法作用域, 只要確定你的作用域, 就不會再改變。

    範例1

    範例1 測試結果如下:

    利用全域console.log() 去測試, 可否顯示函式 callname()作用域的值。

    顯示出來的結果

    callname()作用域的變數value, 用外層console.log 去讀取會得到: Uncaught ReferenceError value is not defined

    原因:

    全域console.log() 無法去 callname() 作用域去讀取該變數!

    範例2

    此範例我們加入全域變數 let name =’張小姐’

    我們會知道最後被執行的call2()函式

    原因:

    call2()函式內部有呼叫 callname() 函式, 而callname()函式作用域內並沒有宣告name變數, 所以callname() 函式會去全域變數查找name值(綠色箭頭部分) 。

    顯示出來的結果

    以上就是不同的作用域之間的關係, 希望大家不要搞混了。