1. 程式人生 > >JavaScript: 函式宣告與函式表示式

JavaScript: 函式宣告與函式表示式

//函式宣告
 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