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