Javascript中變量函數申明優先級

Javascript中變量函數申明優先級。

案例一

console.log(a); //輸出function a(){}
function a() {};
var a=3;

案例二

function a() {};
var a=3;
console.log(a);//輸出3

為什麼兩者輸出不一樣呢?

解析:

針對案例一

其執行流程可以細化為

1.首先會申請一個空間,開始申明函數a,然後在執行申明變量a,發現已經有a的聲明,於是不進行申明

2.然後,就執行console.log(a);即輸出函數a

3.最後執行在執行賦值操作,將a=3,這時候函數a就被轉為變量類型,並賦值為3。為瞭驗證,可以將程序改為如下

 

a();
function a() {
	console.log(5);
};
var a=3;
a();

可以發現程序執行結果如下:

 

因為在賦值之前,a仍然是函數,當執行賦值語句後,a變為3瞭,執行a()就會報錯。

針對案例二

同理可以知,首先申明瞭函數a,然後在執行申明變量a,發現已經有a的聲明,於是不進行申明,接下來,執行瞭賦值語句,將函數a轉為變量。最後輸出變量a的值

總結:

 

1)函數被申明的優先級高於變量

2)被聲明過的變量名或是函數名不會被重復申明

3)變量和賦值語句一起書寫,在js引擎解析時,會將其拆成聲明和賦值2部分,聲明置頂,賦值保留在原來位置

補充

1.下面代碼執行結果為

 

var x=0;
f();
console.log(x);
var f=function(){
	x=1;
}
f();
console.log(x);
function f(){
	x=2;
}
f();
console.log(x);

答案:2 1 1

 

發佈留言