在函式外宣告的變數屬於全域變數,這時所有的函式都可以取用這個變數。
//在函式外宣告一個變數
let steak = 500;
function total(num) {
//在函式內也可以取用
console.log(num * steak);
};
total(2); // 1000
console.log(steak); //500
在函式內宣告的變數,只有在宣告的這個函式內才可以取用。
function total(num) {
//在函式內宣告一個變數
let pork = 250;
console.log(num * pork);
};
total(2); //500
console.log(pork); //pork is not defined
為什麼在函式外宣告的變數所有函式都可以取用呢?
當我們宣告函示時,都會在執行環境內新增記憶體,而這塊範圍就式這個變數的作用域。
假若你在一個函式中寫到了某個變數,但卻沒有在這個函式內宣告,它就會開始向外去尋找這個變數來使用。
let A5Beef = 1000;
function treat() {
let guest = "哥哥";
let quantity = 2;
function totalPrice() {
//此時內層函式沒有需要的變數,就會向外層去尋找
return `這頓飯我請${guest}吃,不過才 ${quantity * A5Beef} 元嘛!(泣)`
};
console.log(totalPrice());
};
treat();
//這頓飯我請哥哥吃,不過才 2000 元嘛!(泣)
內層的函式 totalPrice 需要用到的變數因為自己沒有,就開始向外層尋找,
外層再找不到 A5Beef 這個變數時,又繼續向外面找。
無論全域變數還是區域變數,在宣告時都會占掉一個記憶位置;
差別在於區域變數只有在執行時才會產生並占掉記憶體位置,並且在執行完後就會將記憶體釋放。