首先上圖
函式a是函式宣告,執行的是函式提公升,實際效果是
functiona(
)a()
;
即會把整個函式宣告提到作用域頂端
而函式b是函式表示式,執行的是變數提公升,實際效果是
var b;b(
);b=
function()
由於b已經宣告了,所以不會報錯referenceerror,而是typeerror。
另外補充一點,函式宣告和變數宣告都會被提公升。但是函式會首先被提公升,其次才是變數。
foo()
;var foo;
function
foo(
)foo
=function()
;
猜猜會是什麼結果?
會輸出1而不是2
該**片段會被引擎理解為如下形式
function
foo(
)foo()
;foo
=function()
;
var foo儘管出現在function foo() {}的宣告之前,但是函式宣告會被提公升到普通變數之前。重複的var宣告被忽略。
但是出現在後面函式宣告卻可以覆蓋前面的函式宣告
foo()
;//2
function
foo(
)function
foo(
)
這也許是無用的理論,但是它說明了一點,在同乙個作用域內做重複定義很容易出問題。 函式宣告與函式表示式
對函式宣告和表示式加以區別 在解析器向執行環境中載入資料時,對函式宣告和函式表示式並非一視同仁。解析器會先率先讀取函式宣告,並使其在執行任何 之前可以呼叫 至於函式表示式,則必須等到解析器執行到它所在的 行,才會真正被解釋執行。函式宣告 alert hello 返加值 hello function ...
函式宣告與函式表示式
1 function sum num1,num2 1 function sum num1,num2 解析器在向執行環境中載入資料時,會率先讀取函式宣告,並使其在執行任何 前可用 可以訪問 而函式表示式,必須等到解析器執行到他所在的 行,才會被真正解析執行。其它情況都是相同的。1 正常執行 2 ale...
函式宣告與函式表示式及變數宣告提公升的底層實現
函式宣告與函式表示式 疑問1 var aa function function aa aa 2function aa var aa function aa 2疑問2 function aa var bb aa aa function aa 2 bb 1function aa var bb aa fu...