作用域

作用域

作用域

  • 塊級作用域 (Block Level Scope) 是一種更小的作用域。只存在於 {} 中


let func = (() => {
    let number = 999; {
        console.log(number); // 999
    }
    console.log(number); // 999
})()
console.log(number); // ReferenceError: number is not defined
circle-info

上面這段程式碼,使用了 let 宣告變數 number;所以 number 在 {} 內擁有塊狀作用域。number 只成立於宣告它時它位於的 {} 內,以及它的子 {} 內。

ref
memo

全域執行環境 (Global Execution Context) 全域變數不管是在函式內,還是函式外被使用,都是有效力的。 Function Level Scope 變數如果是在函式內 (函式的 {} 內) 被宣告。他的影響就只限於這個函式最外層的 {} 中出了 {} 就完全沒用了 (記憶體會被回收)。想要使用它會出現 ReferenceError

塊級作用域 (Block Level Scope) 是一種更小的作用域。只存在於 {} 中。最常出現在 Function Scope 中的 {} 中(像是 if、for 等語法)。聰明的你也許會想,是不是也可以將 Function Scope 看成是 Block Scope 的一種?是的 在 ES6 後,宣告變數還是建議只使用 const 或者 let 哦

var 的缺點:

允許重複宣告

不支援區塊作用域 (Block Scope)

不支援常數 (Constant) 特性 於 Javascript,只要暸解它是採用靜態作用域 (Static Scope) 或是所謂的語彙作用域 (Lexical Scope) 就可以了。 這樣的行為 — 由內到外的這條找尋鏈,我們就稱呼它為作用域鏈

全局作用域:函数外部的作用域

函数作用域;函数内部的作用域

块级作用域:{ } 包裹着的代码

全域環境是我們一開始在執行JavaScript,瀏覽器所建立的環境,也是最外層的環境。 在JavaScript中即使不以var宣告,一樣可以執行,但就算在涵式內也視為全域變數,更進一步來說,是window全域物件的屬性。

var 與 let ,for 迴圈的綁定(bind)差異

var 的提升與 let / const 不同

var 與 let / const

circle-exclamation

提升

變數與函數都可以先使用再宣告

只有變數的宣告會提升,賦值不會提升

建議大家以後不要使用 var 做宣告囉,var 可能會產生重複宣告的問題之外,若在宣告之前使用,還會有找不到變數宣告的地方的問題,搞得大家很亂、很痛苦 ><。

undefinedis not defined 是不一樣的錯誤,undefined 的意思是「我不知道他的值是多少」,is not defined 是「未宣告」的意思,Javascript 給已宣告未賦值的變數或是函數的預設值都是 undefined 函式陳述式 (function declaration) 會被提升 函式運算式 (function expression) 不會被提升

使用 let(const) 宣告,在你 Execution 階段以前,任何人都不能碰它(don't initialize it),讓他保持 uninitialized (尚未初始化) .

  • 如果一個值被標註是 uninitialized (尚未初始化) ,你還是嘗試接觸它,那就會有一個錯誤: TDZ (temporal dead zone) 有圖!!

函式表達式的提升

Day16 函式陳述句與函式表示式arrow-up-right

  • Function Statement(函式陳述句)與Function Expression(函式表達式、表示式)

  • 表達是一試種有回傳值的函式

看作變數提升

變成

Last updated