創造與提升/JavaScript 與 undefined
提升(Hoisting)
b(); //Called b!
console.log(a); //undefinedvar a = ‘Hello World!’;function b() {
console.log(‘Called b!’);
}
當語法解析器執行程式碼,開始設定轉化程式碼時,它會知道你在哪裡創造變數和函數,並在創造階段設定變數和函數在記憶體裡,這個步驟叫做「提升」(hoisting)。
- 函數:變數和函數已經存在於記憶體中,所以當程式被逐行執行時可以找到它們,函數已經全部在記憶體了,代表函數裡面的程式碼已經被執行了。(比變數優先提升)
- 變數:JavaScript為a空出記憶體空間時,它不知道a會是什麼值,直到它被執行才知道。因此先放上undefined的替代文字,表示「我還不知道他的值」,如果我們都不設值的話也會得到一樣的替代文字。
結論:所有JavaScript的變數一開始都會被設定為undefined(預設值),然後函數則是完全被設定好放進記憶體中。
whosName();
function whosName() {
if (myName) {
myName = “杰倫”; }}var myName = “小明”;
console.log(myName); //小明
_____-創造階段function whosName() { } //優先提升函式
var myName //宣告變數,提升預留為undefined-執行階段whosName(); //呼叫函數function whosName() {
if (myName) { //此時undefined為false
myName = "杰倫";}} //條件不成立,不賦值myName = "小明"; //賦值myName = "小明"
console.log(myName); //myName = "小明"
Undefined VS Not defined
- Undefined: 被宣告過已存在於記憶體中,但尚未被賦值。undefined其實是JavaScript設定的初始值,會佔據記憶體空間的特殊關鍵字。
var a
console.log(a) //undefined
- Not defined: 未被宣告過,記憶體中根本不存在。
console.log(a) //a is not defined.