我正在研究將代碼注入已有代碼的調試器。然後使用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();
問題1:您正在使用eval。 eval在全局範圍內運行......這就是爲什麼第一個工作原因是變量b在全局範圍內。 – epascarello 2014-11-20 21:20:04
什麼是「真實世界」代碼,我相信你沒有使用警報。你爲什麼使用字符串? – epascarello 2014-11-20 21:22:31
我正在跟蹤更新,二進制,邏輯和分配表達式以及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