2016-03-26 37 views
1
function func1(str) { 
    eval(str); 
    newVar = 100; 
    function func2() { 
    console.log(bar); 
    console.log(newVar); 
    } 
    func2(); 
} 

func1("bar = 42;"); 

我讀過的eval()函數的關鍵字應該避免,因爲它欺騙詞彙範圍(這會導致代碼運行速度較慢)。通過上面的例子(或者其他任何人的例子)的上下文,我試圖理解這種編譯器優化可能會最終破裂。究竟怎樣的eval()關鍵字破編譯器優化的JavaScript

看着這條線newVar = 100;這個變量也將在執行階段由引擎創建(在全局範圍內)。我認爲這不等於「欺騙」詞彙範圍。那麼eval的問題(「bar = 42;」)基本上做了類似的事情?希望問題清楚。

+0

如果引擎知道哪些部件可以看到並將使用(提前,在解析時),則函數可以運行得更快。在''use strict'中不工作的代碼'是一個很好的符號,你正在使用'eval()'次優。 – dandavis

+0

你在這裏問什麼? – amanuel2

+0

想象一個外科醫生執行程序的功能;如果患者的X線片上有不清晰的區域,則在進行仔細的手術探查時需要更長時間才能完成手術。 – dandavis

回答

2

因爲他們是編譯器優化,並傳遞給eval的代碼幾乎是義不容辭的解釋

在你的情況下,現代引擎可能足夠聰明,以實現它是一個字符串文字並相應地優化,但是仍然創建一個新的執行上下文,並且你浪費了一個函數調用。幾乎每個普通程序都使用eval的東西,可以完成而不是 eval。

function func1(value) 
{ 
    var bar = value; 
    var newVar = 100; 
    function func2() { 
    console.log(bar); 
    console.log(newVar); 
    } 
    func2(); 
} 

func1(42); 

編輯:其實,讓我們去更深入。在上面的代碼中,當達到代碼的console.log(bar);部分時,不存在可能不確定bar的狀態。它總是一個數字。實際上,它始終是42.假設引擎有一個完美的優化算法,如果來自您評估的代碼的輸入是動態的,例如來自AJAX回覆或某種形式的用戶輸入,這種情況也會如此嗎? 並非總是。而且優化總是需要是他們假定要削減最終代碼的東西。

+1

很好的寫作,並歡迎。一個尼特:「優化始終需要確定它們所假設的事情是不正確的:與路徑追蹤一樣,CPU緩存缺失很多,但是如果計算錯誤的速度很快,即使通常正確的猜測也會加快速度。 – dandavis

+0

事實上,當我說「優化」時,我在考慮高級類型推斷,而不是所有其他優化。我的錯。感謝您的歡迎,澄清和第一次upvote ^〜^ – henry700