函式宣告與函式表示式的區別

2021-09-13 23:35:07 字數 2522 閱讀 7862

無論在哪兒定義函式,只要是外層函式並且滿足不被包裹,就都可以進行全域性範圍的呼叫

function foo()
在函式體內部的函式宣告無法提公升到全域性,只能提公升到函式體內頂部(塊級作用域空間)

function test() 

} test(); // 1

test2(); // uncaught referenceerror: test2 is not defined

函式體內部執行:

function test() 

} test(); // 2

在外部要想訪問函式內部申明的函式,需要先return出來:

function test() 

return

} test().test2(); // 2

函式表示式需要等到表示式賦值完成才可以

換言之使用var來宣告函式,就會涉及到變數的宣告提公升,先拿出變數名定義為undefined,再隨著邏輯順序進行賦值先定義,後使用
var foo = function ()
toast()    // hello world

showtoast(); // shwotoast is not a function

var showtoast = function ()

function toast()

在這裡只需要把showtoast提前就好了
主流瀏覽器解析,ie11+
var sayhello;

console.log(typeof (sayhey));//=>undefined

console.log(typeof (sayho));//=>undefined

if (true)

sayhello = function sayho()

} else

sayhello = function sayho()

}sayhey();// => sayhey

sayhello();// => sayhello

在花括號裡面宣告的函式在進行預解析時只會提公升函式名,不會提公升函式體,所以不管if條件是否為真,函式體都不會提公升,永遠是undefined,接下來隨著if條件判斷進行解析賦值,當然是走ture方法。

ie9,ie10

var sayhello;

console.log(typeof (sayhey));//=>function

console.log(typeof (sayho));//=>undefined

if (true)

sayhello = function sayho()

} else

sayhello = function sayho()

}

sayhey();// => sayhey2

sayhello();// => sayhello

在這裡的ie將所有的函式宣告進行了提公升,從而由sayhey2替代了sayhey,函式表示式的在順著條件判斷進行了定義,執行為true的情況,進行賦值解析。

ie8

var sayhello;

console.log(typeof (sayhey));//=>function

console.log(typeof (sayhello));//=>function

if (true)

sayhello = function sayho()

} else

sayhello = function sayho()

}

sayhey();// => sayhey2

sayhello();// => sayhello

ie8在這裡處理的比較奇葩,正常的函式申明提公升,但是卻也將條件判斷為假的情況進行了提公升,我們看到typeof (sayhello)=>function

由於函式宣告提公升的差異,想要在條件判斷中定義不同的函式方法,應該採用定義函式表示式的方法,這樣就在各個瀏覽器中拿到相同的函式方法,得到相同的結果。

var sayhello;

console.log(typeof (sayhey));//=>undefined ie8以下解析為function

console.log(typeof (sayho));//=>undefined

if (true)

} else

}sayhey();// => sayhey

參考

函式宣告與函式表示式的區別

一 函式宣告中函式名是必須的 函式表示式中則是可選的 函式宣告 function sum a,b alert sum 1,2 函式表示式 var s function sum a,b alert s 1,2 var s function a,b alert s 1,2 以上兩種都可以 二 用函式宣告...

簡單區別函式宣告與函式表示式

函式宣告 function a 函式表示式 var a 後面的就是函式表示式 var a function 兩者主要的區別就是宣告提前 函式宣告不僅會提公升宣告,還會提公升定義.test 呼叫成功 function test 而函式表示式只會提公升宣告,不會提公升定義 test 有test這個變數,...

函式宣告與函式表示式

對函式宣告和表示式加以區別 在解析器向執行環境中載入資料時,對函式宣告和函式表示式並非一視同仁。解析器會先率先讀取函式宣告,並使其在執行任何 之前可以呼叫 至於函式表示式,則必須等到解析器執行到它所在的 行,才會真正被解釋執行。函式宣告 alert hello 返加值 hello function ...