是在創造階段被設定,設定var變數和函數分配到記憶體裡,這個步驟叫提升(hoisting),它不是真的把你的程式碼移到最上面。
這表示在逐個執行程式碼之前,JS已經將變數、函數在記憶體中建立一個空間了,所以變數和函數已經存在於記憶體中,當程式被逐個執行時,即可以找到它們。
var 沒有block scope,會考慮到hoisting
let,const 有block scope,沒有hoisting
var a ='Hello World!';
function b (){
console.log('Called b!');
}
b();
console.log(a);
執行結果
先呼叫,函數之後才宣告
b();
console.log(a);
var a ='Hello World!';
function b (){
console.log('Called b!');
}
執行結果
但變數的情況又有點不同
例:
把宣告a拿掉
b();
console.log(a);
function b (){
console.log('Called b!');
}
執行結果
var宣告的變數的情況有點不同,a空出記憶體時,JS不知道它是什麼值,直到它被執行才知道,因此它會放上undfined的替代文字,表示「JS還不知道的值」,值還未被設定
所有JavaScript的變數 一開始都會被設定為undefined,函數則是被設定好放進記憶體中。
因此即使一個函數之後才宣告,我們依然可以先呼叫,因為這些東西已經在記憶體裡了。
要注意一開始的記憶體會分配給var變數,但不會給let 和const
例:
var宣告但不給值
var a;
console.log(a);
執行結果undefined
例2:
let宣告但不給值
let x;
console.log(x);
執行結果undefined
例3:
const宣告但不給值
const y;
console.log(y);
執行結果出現錯誤
例:
var 在if內宣告
if(true){
var x = 10;
console.log(x);
}
console.log(x);
執行結果
例:
const 在if內宣告
if(true){
const x = 10;
console.log(x);
}
console.log(x);
執行結果,const和let結果都會一樣
建議不要將變數的值設定為undefined,可能會讓你搞混!