>宣告的變數會被限制其作用域,作用域會因宣告的語法 var , let , const 的不同而有所變化 # var為涵式作用域 var所涵式內宣告的變數作用域是限制在涵式內,反之在外面宣告的話,就會變成「全域變數」。 ``` function fn () { var a = '小明' console.log(a); // 小明 } fn() console.log(a); a is not defined ``` JavaScript中,特別機制稱為「語法作用域」(Lexical scope),又稱為「靜態作用域」,意旨原始碼在經過直譯器執行後,就已經確定作用域,並不再改變。 --- ## 3.核心實戰題-var宣告的變數作用域範圍為和? ``` function fn () { var a = '小明' console.log(a); // 小明 } fn() console.log(a); a is not defined ``` 透過「向外查找」的機制,尋找其外層的涵式、作用域是否有該名稱的變數。 如果最外層的全域都沒有該變數名稱,才會跳出「xxx is not defined」的錯誤提示。 ``` var a = '小明' function fn () { console.log(a); // 小明 } fn() console.log(a); 小明 ``` --- ### 重點 > * 變數是採語法作用域,程式碼寫完就確認作用域了。 > * 如果涵式內沒有此變數,會採用「向外查找」機制,一直查找到最外層的全域變數。 --- ## 4.核心實戰題-let、const宣告的變數作用域範圍為和? ES6主流,採用let、const宣告變數 * let 【區塊作用域】 可重新賦值 * const 【區塊作用域】 常數無法重新賦值 何謂「區塊」呢?基本上只要看到 { } 都可認定為區塊。例如: 1. 涵式定義時的 function() { },其中{}可認定為一個區塊。 2. if、for迴圈都會使用{},皆屬於區塊作用域的語法 實戰常用的區塊作用域: * **涵式**:function(){...} * **for迴圈**:for(let i=0; i<10; i++){...} * **判斷式**:if(expression){...} * **純粹的區塊**:{ } for迴圈結束後,let所宣告的變數則會釋放,因此無法取得該變數 在這類型的陳述式中(if、for...),小括號內的let作用域等同於其後方的大括號。 ``` for(let i=0; i<10; i++){} console.log(i); // 10 for(let j=0; j<10; j++){} console.log(j) // j is not defined ``` --- ### 重點 > var 屬於函式作用域(function scope) > let、const 屬於區塊作用域(block scope) ## 下一站 [1-3提升](https://hackmd.io/@KFqiBO5dTA2-3EAj3rqZQg/HkEa39is3)
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up