JavaScript: 函式宣告與函式表示式
阿新 • • 發佈:2019-02-17
//函式宣告
var functionOne =function(){
//code....
}
//函式表示式
function functionTwo(){
//code....
}
在JS中, 這兩個不同方式來定義function時,有個區別在於functionOne定義於run-time時期,functionTwo定義於parse-time。
也就是說
<script>
//報錯
functionOne();
var functionOne =function(){
//code....
}
</script>
<script>
//正常
functionTwo();
function functionTwo(){
//code....
}
</script>
而且,functionOne 僅僅是一個變數,一個匿名函式的返回值賦值給了它而已。
函式表示式與其他表示式一樣,在使用前必須賦值
即使像如下定義函式,它依舊是一個匿名函式,把對它的引用儲存在變數
functionThree中。它並沒有真正把對函式的引用儲存到名為fact的變數中,而只是允許函式體引用這個名字來引用自身
var functionThree = function fact(x){
if(x<1)
return 1;
else
return x*fact(x-1);
}
再看下面兩段程式碼:
if(condition){
function sayHi(){
alert("Hi");
}
}else{
function sayHi(){
alert("Yo");
}
}
表面上看,以上程式碼表示在condition為true時,使用一個sayHi()的定義否則,就使用另一個定義。實際上,這在ECMAScript中屬於無效語法,JavaScript引擎會嘗試修正錯誤,將其轉換為合理的狀態。但問題是瀏覽器嘗試修正錯誤的做法不一致。大多數瀏覽器會返回第二個宣告,忽略condition;FireFox會再condition為true時,返回第一個宣告。因此這種使用方式很危險,不應該出現在你的程式碼中。不過使用函式表示式,那就沒有什麼問題了。
var sayHi ;
if(condition){
sayHi = function (){
alert("Hi");
}
}else{
sayHi = function (){
alert("Yo");
}
}
上面 的例子不會有什麼意外,不同的函式會根據condition被賦值給sayHi