2012-02-05 29 views
6

請考慮代碼兩個片段(第一印 「本地EVAL」,第二打印 「全球EVAL」):區分本地EVAL

(function f() { 
    var x; 
    try { 
     eval("x"); 
     console.log('Local eval'); 
    } 
    catch (e) { 
     console.log('Global eval'); 
    } 
}()) 

var globalEval = eval; 
(function f() { 
    var x; 
    try { 
     globalEval("x"); 
     console.log('Local eval'); 
    } 
    catch (e) { 
     console.log('Global eval'); 
    } 
}()) 

它事實證明,即使globalEval === eval評估爲true,globalEvaleval行爲不同,因爲他們有不同的名稱。 (如果它被精確地寫成eval,則eval只能是本地的。)

我怎樣才能區分爲兩個evals?有沒有辦法提取變量標籤來推斷行爲?

+0

@MattiVirkkunen:我試圖構建一個[this]的示例(http://stackoverflow.com/questions/7223517/pure-function-given-strictly-equal-arguments-yielding-non-strictly-equal - 結果)。我很接近,但尚未完成。 – Randomblue 2012-02-05 16:02:13

+0

爲什麼你不堅持[你以前的問題](http://stackoverflow.com/questions/9145385/accessing-local-eval-inside-function-scope)? – 2012-02-05 16:06:06

+0

@amnotiam:它有點不同,我感到困惑。我希望我可以刪除它。 – Randomblue 2012-02-05 16:11:05

回答

2

有趣。但是,由於您掌握了何時/何時定義您對eval的引用,因此您可以說出如何區分它們。例如,有一個具有「函數指針」的對象,並指示範圍 - 如果定義了它,就知道自己的位置。

I.e. myEvaluator.scope會告訴您關於評估範圍的獲取位置的信息,並且可以使用myEvaluator.eval進行評估。