2014-12-05 78 views
6

編碼如果我把一個函數變成一個像這樣的字符串:調用JavaScript函數的字符串

var functionString = function (message) { 
    console.log(message); 
}.toString(); 

有什麼辦法將字符串轉換回功能,調用它呢? 我試圖

eval(functionString) 

返回 「未捕獲的SyntaxError:意外的標記」,並

functionString.call(this, "HI!"); 

返回 '未定義是不是一個函數'。

這是甚至可能在JavaScript?

在此先感謝您的回覆!

編輯:這個問題的關鍵是,該函數已被轉換爲使用toString()字符串。所以

console.log(functionString); 

返回此字符串: 「功能(消息){執行console.log(消息);}」

我可以轉換的字符串返回到一個函數,並調用它?這是我正在努力解決的問題。 謝謝!

+0

如果您準確地發佈字符串中的內容,這將有所幫助。 – Pointy 2014-12-05 21:09:50

+0

您可以在函數 – ryanc1256 2014-12-05 21:12:56

+0

中執行「返回message.toString()」是否可能,是的,可以,但是您想要做什麼? – epascarello 2014-12-05 21:14:52

回答

2

你​​正好包含字符串

"function (message) { console.log(message); }"

評價它,是不存在的JavaScript引擎與不正確的語法(沒有此功能沒有名字)。 JavaScript期望構造像function <name>(<params>) { }。或者,您可以使用匿名函數(即不存在名稱),但只能用作參數或評估表達式的上下文。最小的典型評估表達式將是​​如果您想要看起來,!function() {}也可以 - 前面的感嘆號將其轉換爲布爾表達式,它需要在否定輸出之前進行函數評估。

所以,在你的榜樣,這將工作:

eval("("+functionString+")('abc')");

,因爲你做的匿名函數調用 - 這是JavaScript可以住在一起。

或者,您也可以只使用括號,那麼你需要指定的東西,你以後可以使用結果:

var foo = eval("("+functionString+")"); 
foo('ddd'); 

這裏是一個小的證明/操場學習一下吧: http://jsfiddle.net/Exceeder/ydann6b3/

+0

作品,謝謝!你能告訴我,我應該谷歌瞭解更多關於這個,例如+包裝的functionString? – user1840267 2014-12-05 21:28:43

+0

@ user1840267這是串聯...... – 2014-12-05 21:29:52

+0

@ user1840267對於eval(),打印您評估的實際字符串總是有意義的,然後將其複製粘貼到您選擇的編輯器中的空.js文件中,並查看它是否是語法上的正確。 – 2014-12-05 21:32:12

3

你快到了,但你錯過了一些東西。

當我們調用你的函數的toString(),我們得到

"function (message) { 
    console.log(message); 
}" 

然後我們可以EVAL。但是,我們只是在這裏創建一個匿名函數對象;我們將無法稱呼它!

如果我們不是喜歡的東西:

var functionString = "var restoredFunc = " + function (message) { 
    console.log(message); 
}.toString(); 

然後,我們可以做以下

eval(functionString); 
// prints "hello!" to console 
restoredFunc("hello!"); 
+0

這也是一個有趣的方法,謝謝! +1 – user1840267 2014-12-05 21:41:36

1

是其在JavaScript中可能的,但你不能沒有eval分配匿名函數

所以你像這樣穿過它

var functionString = function (message) { 
    console.log(message); 
}.toString(); 

eval("myfunction =" + functionString) 

myfunction("Hello World!") 
1

你​​是一個字符串,它看起來像

"function (message) { 
    console.log(message); 
}" 

你可以隱蔽該字符串使用字符串連接,類似於下面的立即調用的函數表達式(IIFE)。

(function (message) { 
     console.log(message); 
})("HI!"); 

然後評估。以下是Chrome的JavaScript控制檯的結果:

eval('(' + functionString + ')("HI!")') 
HI!