2010-07-29 26 views
4

爲了簡便起見,我已經包括了一個腳本,其名稱動態地調用一個函數:動態命名和執行JavaScript函數體

var foo = "hello"; 
var bar = "world"; 
var function_name = "say_" + foo + bar; 

// Since its name is being dynamically generated, always ensure your function actually exists 
if (typeof(window[function_name]) === "function") 
{ 
    window[function_name](" World!"); 
} 
else 
{ 
    throw("Error. Function " + function_name + " does not exist."); 
} 

function say_helloworld(the_word) 
{ 
    alert("Hello " + the_word); 
} 

但功能say_helloworld的代碼寫在靜態的時尚。我想這樣的:

var function_implementation = 'function say_'+foo+bar+ 
    '(the_world){alert("Hello " + the_world);}'; 
eval(function_implementation); 

但沒有使用eval()。還有一種更醜陋的方法:做一個AJAX調用來獲取函數。

你能看到更好的方法嗎?

回答

5

您可以使用內聯函數表達式:

window['say_'+foo+bar]= function(the_world) { 
    alert('Hello '+the_world); 
}; 

但是,幾乎從來沒有一個很好的理由使用動態命名變量。在一個單獨的查找對象,而不是存儲功能:

var says= { 
    helloworld: function(the_world) { 
     alert('Hello '+the_world); 
    }, 
    somethingelse: function(otherthing) { 
     alert('Something else with '+otherthing); 
    } 
}; 
says[somevar]('potatoes'); 
+0

優秀的答案,謝謝! – 2010-07-29 12:27:19

1

如果您要在不eval動態生成功能,你可以使用構造

Function([arg1[, arg2[, ... argN]],] functionBody) 

這樣你就可以做的東西一樣

var func = new Function('message', 'alert("Hello, " + message);') 
func('world!'); 

有關更多說明,請參閱MDC

乾杯

注意:我從來沒有使用過這種方法之前,我沒有以前使用Function()構造。所以我不知道這是否會有其他的缺點。

+0

有趣,它是否也適用於其他渲染引擎? – 2010-07-29 12:43:35

+1

@altvali它包含在ECMA-262第三版(http://www.ecma-international.org/publications/standards/ecma-262.htm)中,它是Javascript 1.5的基礎。根據維基百科(http://en.wikipedia.org/wiki/JavaScript#Versions)甚至IE5.5都應該明白這一點。 – moxn 2010-07-29 13:30:44

1

可以使用的超時會解釋你的代碼,但它可能會使用eval內部所以不知道,如果你想這個..

fText = 'function test(a){alert(a);}'; 
setTimeout(fText,0); 

,但你需要調用它之前允許幾毫秒..