1、function f(x){return x*x;}??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? //function函數,調用function語句;
2、var f=new funtion{"x","y","var z=x*y;return z;"}??? ??? ??? //function()構造函數,
3、var f=funtion(x){return x*x;}?? ?? ?? ?? ?? ?? ?? ? ?? ??? ??? ??? ??? ? //函數直接量

第1種方式是一個語句,而另2種方式則是由javascript的表達式創建的,可以作為一個表達式來使用,可以方便地用在多種場合。對于那些只要使用一次并且不用命名的函數,就可以用第2,3種方式來創建。

第2種方式允許動態地建立和編譯一個函數,這樣,我們使用函數時,就不用限制在function語句預編譯的函數體種。但是第2種方式創建的函數有個缺點,每次調用這個函數,即是調用了function()構造函數,都會解析函數體并且創建一個新的函數對象。如果這個函數要經常使用(例如用在循環體中),將會頻繁調用構造函數,執行效率就會非常低。

第3種方式創建的函數是程序結構的一個靜態部分,是一個表達式,可以用來定義匿名函數。用于循環體時,我們可以選擇第3種方式來創建函數。

第2種方式的函數主體"var z=x*y;return z;"是作為字符串存在的,每次調用構造函數時就會作為參數傳遞給function(),被解析和編譯一次。

第3種方式創建的函數只需要解析和編譯一次,就可以多次使用,函數主體是標準的javascript語法。

第2種方式創建的函數總是被當作頂級函數來編譯,下面這個摘錄自《javascript權威指南(第四版)》的列子可以說明:

var y="global";
function constructFunction(){
??? var y="local";
??? return new Function("return y;");
}
alert(constructFunction());?? ?? ?? ?? ?? ?? ?? //顯示global