本篇會談到
區域範疇(Local scope)
function 內宣告變數,當 function 執行完畢之後會全部消失(當下執行時,值是存在的)
function count(one, two){
let total = one + two;
console.log(total);
// 在這邊印出 18
}
count(8,10);
console.log(total);
// total is not defined
// total 會在 function 完成當下就消失
// 會看到值是因為第四行執行當下還存在
全域範疇(Global scope)
let total;
function count(one, two){
total = one + two;
// total 賦予 one + two
// 此時在 function 外面呼叫就會成功
}
count(8,10);
console.log(total);
// 18
a = 0;
function fn() {
a = 1;
}
fn()
console.log(a)
// 上方結果為 1 因為他們沒有被宣告成變數 兩個就都是全域屬性
a = 0;
console.log(a); // 輸出 0
console.log(window); // 全域物件 且裡面會有 a 屬性
delete window.a // 用 delete 刪除屬性 a
console.log(a); // 輸出 a is not defined
console.log(window); // 全域物件的 a 也不見了
var b = 1;
console.log(window) // 全域物件 且裡面有 b
delete window.b // 刪除屬性在這裡不起作用了 因為 b 是變數不是屬性了
console.log(window); // 所以這裡 b 還是存在
console.log(b); // 可以輸出 1
{
var b = 2;
}
console.log(b);
// 2
// {} 是一個 block,沒任何作用,就只是一個 block,先說明程式碼可以這樣寫不會報錯
// 然後在 block 裡面用 var 宣告變數 b,在 block 外也可以獲取到這個變數 b
function fn() {
var a = 1;
debugger; // 這個可以讓程式碼停在這一行 並開啟 Sources 功能
// 此時可以看到右邊的 Scope(作用域)裡面有一個 Local 就是他目前的函式中有哪些東西
}
fn();
var a = 0;
function fn() {
var a = 1;
console.log('local', a) // 1
}
fn();
console.log('全', a) // 0
var a = 0;
function fn() {
a = 1;
}
fn();
console.log('全', a)
// 1,在函式中 全域的值被改變了
var a = 0;
function fnA() {
console.log(a);
}
function fnB() {
var a = 1;
}
fnB(); // 他有自己的作用域在函式裡面,所以不會影響到全域
fnA(); // 這裡就很清楚,輸出結果是全域的 0
var a = 0;
function fnA() {
console.log(a);
}
function fnB() {
var a = 1;
fnA();
// 不需要看在哪調用 fnA() 去決定 a 值
// 而是看 fnA() 被創建在哪、函式中是否有宣告 a
}
fnB();
// 沒有就找 function fnA() {...} 的外層
// 所以上面這題就指向全域的 a,輸出為 0
function fn() {
var a = 1;
var a = 0;
console.log(a)
}
fn();
// 0
// a 作用域只在函式裡
for (var i = 0; i < 10; i++) {
console.log(i);
// 這裡會輸出 0~9
// 一直累加到最後 10 會跳出
}
console.log(i);
// 10
// 因為 i 超過 9 才會跳出 for 迴圈
for (var i = 0; i < 10; i++) {
setTimeout(() => {
console.log(i);
// 10
}, 0);
}
// 輸出 10 因為 setTimeout 屬於非同步行為
// JS 默認在所有事件結束後才會執行非同步行為
// 所以執行 setTimeout 時 i 已經跳出 for 了
console.log(a); // hoising
var a =1;
console.log(a); // 1
JS