2014-11-20 35 views
1

我正在研究將代碼注入已有代碼的調試器。然後使用eval()來記錄和運行它。在Javascript中創建一個可以訪問本地變量的類

但是eval()似乎只適用於其現有的範圍。爲了克服這個問題,我嘗試添加一個我在每個局部範圍內重新創建的類。但它不起作用。

我已經添加了代碼來解釋我的問題。第一個警報按預期工作,我假設這是因爲MyClass是在相同的範圍內創建的。

即使我已經在本地範圍中將b設置爲20,TestC函數中第二個警告仍顯示b爲10。並且最後一個警報在控制檯「Uncaught ReferenceError:c未定義」中的所有eval()返回中都不起作用。

如果我在每個函數中添加整個MyClass並賦值,那麼它可以工作,但這並不像一個優雅的解決方案。並且可以將1000行代碼添加到項目中。

http://jsfiddle.net/ekim/zryj3taq/2/

var MyClass = function() 
{ 
    this.MyAlert = function(codex) 
    { 
     eval(codex); 
    } 
} 

var b = 10; 
var MyOne = new MyClass(); 
MyOne.MyAlert("alert(b);"); 

function TestC() 
{ 
    var b = 20; 
    var MyOne2 = new MyClass(); 
    MyOne2.MyAlert("alert(b);"); 

    var c = 20; 
    var MyOne2 = new MyClass(); 
    MyOne2.MyAlert("alert(c);"); 
} 


TestC(); 
+0

問題1:您正在使用eval。 eval在全局範圍內運行......這就是爲什麼第一個工作原因是變量b在全局範圍內。 – epascarello 2014-11-20 21:20:04

+0

什麼是「真實世界」代碼,我相信你沒有使用警報。你爲什麼使用字符串? – epascarello 2014-11-20 21:22:31

+0

我正在跟蹤更新,二進制,邏輯和分配表達式以及IF塊,循環,...包含函數調用如「IF f(5)+5> 10 ..」或a = f(5)+5的塊;我的幫助函數將其轉換爲helperF('Temp1 + 5',f(5),'f(5)'),最後的2個參數可以是2,4,6,取決於多個函數或嵌套函數。原因是我希望能夠記錄函數的輸出以及結果。我無法兩次傳遞函數輸出。如果函數有一些代碼全局i ++等等,插入的代碼會破壞原來的算法。 – Ekim 2014-11-20 21:30:44

回答

1

您可以使用new Function(\[arg1\[, arg2\[, ...argN\]\],\] functionBody)

(function(){  
 
    var str = "return (A+B)*C"; 
 
    var myFunc = new Function("A","B","C", str); 
 
    var result = myFunc(2,3,4); 
 
    console.log(result); 
 
}()); 
 

 

 

 
/* Example with function */ 
 
(function(){  
 
    
 
    var fncDouble = function (X) { 
 
     return X*2; 
 
    } 
 

 
    var str = "return F(A)+B"; 
 
    var myFunc = new Function("F","A","B", str); 
 
    var result = myFunc(fncDouble,3,1); 
 
    console.log(result); 
 
}());

+0

謝謝,我不知道你可以不使用eval()就可以運行字符串代碼。 – Ekim 2014-11-20 22:45:59

0

據我所知,目前還沒有簡單的解決方案,這一點,作爲eval()函數只是創建了一個新的,獨立的編譯器。

0

試試這個:MyOne2.MyAlert.call(this, "alert(b)");

+0

我不明白這背後的邏輯,不幸的是它沒有改變任何東西。 – Ekim 2014-11-20 22:37:19

相關問題