2010-12-05 23 views
2

如何執行一個字符串作爲代碼(使用eval())並給它一些變量?例如,我有一個名爲vars的對象,並希望它的每個屬性都可以在代碼中進行訪問,而無需指定對象名稱。事情是這樣的:eval()與範圍內的對象的變量

function evalWithVariables(func, vars) { 
//some magic here 
return eval(func); 
} 

function test() { 
var retval = evalWithVariables("a>5", {"a":7}); 
console.log(retval); 
} 

哦,代碼是可信的,它來自相同的服務器腳本,它不是用戶生成的,我敢肯定,eval這裏是合適的工具(和我知道eval往往是邪惡的)。

編輯:對我來說最重要的是,傳遞給eval()的代碼看起來不錯,很簡短,並且不需要包含幫助變量名等等。

回答

3

發現,它可能只使用with

eval("with (vars) {var result = (" + func + ")}"); 
1

您可以重構爲JavaScript代碼的值並在其之前加上要執行的代碼。然後,將實際表達式的結果分配給一個局部變量。所以,

evalWithVariables("a>5", {"a":7}); 

實際上eval S:

var a=7; var result = (a>5); 

然後,eval之後,檢查result值:

function evalWithVariables(func, vars) { 
var varString = ""; 

for (var i in vars) 
    varString += "var " + i + " = " + vars[i] + ";"; 

eval(varString + "; var result = (" + func + ")"); 
return result; 
} 
+0

嗯,是的,應該工作,但它不知何故看起來不乾淨。 – thejh 2010-12-05 16:09:31

+1

概念本身是不潔的:) – 2010-12-05 17:54:54

0

也許你使用一個功能更強大的方法:

function evalWithVariables(func, vars) { 
    return func(vars); 
} 
evalWithVariables(function(vars) { return vars.a > 5; }, {"a":7}) 

或更短:

(function(vars) { return vars.a > 5; })({"a":7}) 
+0

不,我真的從XML節點屬性加載JS代碼。 – thejh 2010-12-08 14:15:06

1

放棄eval()是生成一個函數,然後用with(),像你一樣,要改變一個選項塊範圍:

function evalWithVariables(func, vars) { 
    return new Function("v", "with (v) { return (" + func +")}")(vars); 
}