js-變數提升
一:Js解析機制
遇到 script 標籤的話 js 就進行預解析,將變數 var 和 function 宣告提升,但不會執行 function,然後就進入上下文執行,上下文執行還是執行預解析同樣操作,直到沒有 var 和 function,就開始執行上下文。
二:
函式宣告和變數宣告總是會被直譯器悄悄地被"提升"到方法體的最頂部。
三:函式宣告提升
a=5;
show();
var a;
function show(){};
預解析:
function show(){}; // 函式的宣告
var a; // 變數的宣告
a=5;
show();
注意:需要注意都是函式宣告提升直接把整個函式提到執行環境的最頂端。
除了以上的函式宣告方式外,還可以使用匿名函式的方式。使用匿名函式的方式不存在函式提升,因為函式名稱使用變量表示的,只存在變數提升。
var getName=function(){
console.log(2);
}
function getName(){
console.log(1);
}
getName
預解析:
//函式、變數宣告提升後
function getName(){ //函式宣告提升到頂部
console.log(1);
}
var getName; //變數宣告提升
getName = function(){ //變數賦值依然保留在原來的位置
console.log(2);
}
getName(); // 最終輸出:2
四:變數提升:
x=5;
elem=document.getElementById("demo");
elem.innerHTML=x; // 使用後宣告
var x;
// 預解析:
var x;
x=5;
elem=document.getElementById("demo");
elem.innerHTML=x;
----------------------------------------------------------------------------
var a=7;
console.log("++++++++++a",a)
console.log("++++++++++b",b) // undefined;因為只是 變數宣告提升,初始化沒有提升
var b=7;
// 預解析:
var a=7;
var b;
console.log("++++++++++a",a)
console.log("++++++++++b",b) // undefined(宣告無初始化);因為只是 變數宣告提升,初始化沒有提升
b=7;