2013-07-22 17 views
2

我需要的eval函數保存爲字符串,然後在JS代碼中使用它,這裏的情景:評估和演示一個字符串轉換爲可調用JS功能

步驟1

<textarea id="function_text">function test(e){ alert(e.id); }</textarea> 

步驟2

var thatFunction = eval($("#function_text").val()); // returns undefined 

步驟3

thatFunction.call({id: 100}); 

有沒有辦法做到這一點?

P.S.我知道所有的安全考慮因素,我只需要在步驟3提醒100!

回答

4

我要去給你一個警告,不這樣做,但在這裏是如何:

var thatFunction = Function('return ' + $("#function_text").val())(); 
thatFunction.call({id: 100}); 
+0

配不上我,就像它保持例如,您可以通過使用分組操作做到這一點評估的東西到最低限度,函數名稱不是它的一部分。 – user1514042

+0

我可以使用您的方法將某些上下文嵌入到eval調用中嗎?我想要在父母上下文中存在的一些功能是可識別的? – user1514042

+0

使用調用,應用或綁定?是的,因爲你正在返回一個函數,你可以添加你想要的任何上下文。或者你的意思是從當前範圍注入現有的函數。這也應該起作用。 –

2

字符串中的代碼將被函數聲明評估,並不會產生收益值,這就是爲什麼eval返回undefined

你可以與你的變量賦值串聯函數聲明:

eval('var thatFunction = ' + $("#function_text").val()); 

簡單地通過它的名稱是調用函數(它,你知道它):

test.call({id: 100}); 

您可能不想在字符串中使用變量名稱。這不是問題,你所要做的就是強制eval將函數定義視爲函數表達式並讓它返回函數。

var thatFunction = eval('(' + $("#function_text").val() + ')'); 

一個更模糊的方式將是逗號操作

var thatFunction = eval('0,' + $("#function_text").val()); 
+0

我不需要它返回,我需要一個函數的一部分用於未來調用。 – user1514042

+0

如果最後一條語句是一個表達式,'eval'將返回結果。但是由於你沒有表達式,'eval'的返回值是'undefined'。我正是這個意思。 –