函式宣告與函式表示式的提公升問題

2021-09-14 01:58:03 字數 1095 閱讀 4889

首先上圖

函式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...