2013-07-05 75 views
1

字符串如下:"foo('argument1','argument2')"執行帶有參數的函數從字符串

我怎麼能執行此功能,如JavaScript,而無需使用eval?我知道你可以使用

window[func](arguments)

不過參數是字符串的一部分。我嘗試使用正則表達式,但我不知道如何做到這一點考慮到JavaScript沒有lookbehinds。有什麼建議麼?

+0

你能解釋爲什麼你想這樣做嗎?從你說的話來看,'eval'是你唯一的選擇,但更多的信息會有所幫助。 – loganfsmyth

+0

有人應該問一下,這個字符串是如何製作的?並且你不能構造更有用的東西,而是(例如JSON) –

+0

如果你可以將參數轉換爲數組,你可以使用'window [func] .apply(null,args)'。 –

回答

0

有幾種方法可以做到這一點,一個已經被dystroy給出了。

一個稍微簡單的方法是這樣的:

var args = "foo('argument1','argument2')".split(/[()',]+/).slice(0,-1) 
Function.prototype.call.apply(window[args[0]],args) 
+0

我喜歡這個。非常非常棒。 –

+0

您是否意識到它較短的主要原因是它只能處理字符串? –

1

您可以使用此:

var s = "foo('argument1','argument2', 5, true)"; 
var m = s.match(/([^(]+)\(([^)]+)\)/); 
if (m) { 
    var f = window[m[1]]; 
    var args = m[2].split(',').map(function(v){ 
    return JSON.parse(v.trim().replace(/^'/,'"').replace(/'$/,'"')) 
    }); 
    f.apply(null,args); 
} 

Demonstration(打開控制檯)

請注意,這僅適用於原始參數。如果你想在沒有eval的情況下處理其他類型的參數,你最好定義你想要處理的類型。

+0

如果我的答案的某些部分不清楚,請問,我會解釋。 –

+0

很明顯。目的是讓我可以有一個內聯自定義事件(即:'')。我使用jQuery來告訴事件觸發,但我需要一種方法來執行'onmyevent'屬性給出的字符串。 –

相關問題