1、聲明優先函數
js 是由上到下一行一行執行的,並不徹底正確,考慮如下代碼:spa
a = 2;io
var a;console
console.log(a);編譯
輸入結果是什麼? 並非undefined,輸出結果是2function
==============變量
考慮下面這段代碼:異常
console.log(a);思考
var a = 2;co
這段代碼你可能認爲會拋出異常 ReferenceError ?然而輸出的結果是undefined
===============
js引擎有兩個步驟,編譯和運行,正確的思考是,包括變量和函數在內全部的聲明都會在任何代碼被執行首先被處理
因此第一個代碼段其實是以下的方式進行處理:
var a;
a = 2;
console.log(a);
第二個代碼段其實是以下流程:
var a;
console.log(a);
a = 2;
==================
函數聲明會被提高,可是函數表達式並不會被提高:
foo(); // TypeError異常
var foo = function(){
//dosomething...
}
2、函數優先
函數聲明和變量聲明都會被提高,可是函數聲明會首先被提高,而後是變量聲明。以下代碼:
foo();
var foo;
function foo(){
console.log(1)
}
foo = function(){
console.log(2);
}
結果會輸出1而不是2,js引擎是以下理解這段代碼的:
function foo(){
console.log(1);
}
foo();
foo = function(){
console.log(2);
}
注意:var foo 儘管出如今function foo()...的聲明以前,可是他是重複的聲明,在這裏被忽略了,由於函數聲明在變量聲明以前