2015-09-04 29 views
0

我碰巧經歷了這個article爲什麼新函數(...)的內容沒有在這些插圖中編譯?

考慮片段:通過使將用於建立一個新的功能的參數期間運行時

function createMyFunction(myOperator) 
{ 
    return new Function("a", "b", "return a" + myOperator + "b;"); 
} 

var add=createMyFunction("+");    // creates "add" function 
var subtract=createMyFunction("-");   // creates "subtract" function 
var multiply=createMyFunction("*");   // created "multiply" function 

// test the functions 
alert("result of add="+add(10,2));   // result is 12 
alert("result of substract="+subtract(10,2)); // result is 8 
alert("result of multiply="+multiply(10,2)); // result is 20 
alert(add); 

即有趣的示例創建3種不同的功能。

作者提到

由於編譯器無法知道什麼樣的最終代碼看起來像 ,新功能(...)的內容的方式未編譯

我只是沒有得到它。有人可以請詳細說明一下嗎?

+1

我猜他們的意思是說,當腳本第一次被解析時,它不會被編譯到代碼中。 –

回答

1

作者不想說該函數沒有編譯 - 因爲我們正在運行它,必須是。

他試圖表示在調用new Function()時解析和編譯代碼new Function("…") - 與使用函數表達式或聲明創建的函數(在分析腳本時編譯)相反。

他使自己的觀點時,他接着說:

...並有可能比聲明函數的其他方式慢。

所以,你應該避免一次又一次地呼喚new Function(),這將是比在封閉創建函數表達式慢 - 它們只編譯一次。根據JS引擎的複雜程度,差異可能很大。

+0

@Bargi:+1,upvoted for「new Function(」...「)在新的Function()被調用時被解析和編譯」。非常感謝你。 –

相關問題