Function() 建構函式
函式通常使用function關鍵字來定義,要麼以函式定義語句的形式,要麼以函式直接量表達式的形式。
函式也可以通過Function()建構函式來定義。
使用Function()建構函式通常比使用函式直接量要難,因此這一技術也並不常用;下面是Function()建構函式建立的一個例子:
var f = new Funcion("x","y","return x*y");
這行程式碼建立了一個新的函式,這個函式和使用下面熟悉的語法定義的函式基本相等;
function f(x,y){ return x*y; }
Function()建構函式期待任意數目的字串引數。最後一個引數是函式的函式體,它可以包含任意多條Javascript的語句,每條語句用分號分開。建構函式的所有其他引數都是字串,用來指定所定義的函式的引數的名字。如果定義一個沒有接受引數的函式,只需要向建構函式傳遞一個字串,也就是函式體;如下:
var f = new Function("return y");
注意,Function ()建構函式並沒有被傳遞給任何一個引數來指定它所建立的函式的名字。和函式直接量一樣,Function ()建構函式建立了匿名的函式。
關於Function ()建構函式,理解如下幾點很重要:
• Function ()建構函式允許JavaScript程式碼被動態地建立並且在執行時編譯;例如,全域性eval()(參見本書第三部分)函式就是這種方式。
• Function ()建構函式解析函式體,並且每次被呼叫的時候都建立一個新的函式物件。如果建構函式的調用出現在一個迴圈中,或者出現在一個經常被呼叫的函式中,那麼這個過程的效率就很低了。相反,出現在一個迴圈或者函式中的函式直接量或者巢狀的函式,並不會每次遇到的時候都編譯。每次遇到一個函式直接量也不會建立不同的函式物件(儘管前面已經提到,在函式定義所在的詞法作用域中捕獲不同之處,可能需要一個新的閉包)。
• 最後,關於FunctionO函式非常重要的一點就是,它所建立的函式並不是使用詞法作用威,相反,它們總是當作頂層的函式一樣來編譯,如下面的程式碼所示:
var y = "global";
function constructFunction() {
var y = "local";
return new Function("return y");
// Does not capture the local scope:
}
// This line displays "global" because the function returned by the
// Function () constructor does not use the local scope. Had a function
// literal been used instead, this line would have displayed "local".
alert(constructFunction{)()); // Displays "global"
引用自書籍《JavaScript 權威指南》