2011-04-09 138 views
1

我要調用一個函數這樣構建js函數名稱動態

redBall(this); 

,但我想從一個字符串動態構建。我嘗試過這樣的東西,但它不起作用。

var color = 'red'; 
color+'Ball'(this); 

回答

5

你可以做這樣的事情:

var ballFunctions = { 
    redBall: function(obj) { 
     alert("Hi, I'm a red ball"); 
    }, 
    blueBall: function(obj) { 
     alert("Hi, I'm a blue ball"); 
    } 
}; 

color = "red"; 
ballFunctions[color + "Ball"](this); 
color = "blue"; 
ballFunctions[color + "Ball"](this); 


你也可以與吉米的回答結合這一點,並做到:

function ball(color, obj) { 
    ballFunctions[color + "Ball"](obj); 

    // Or use the window object if your funcs are in the global namespace like Cameron said 
    // window[color + "Ball"](obj); 
} 

color = "red"; 
ball(color, this); 
+0

,你可以做'ballFunctions [「myNewFunction」] =函數(){... }' – 2011-04-09 01:23:31

+0

謝謝,我嘗試過之後確實有效。 – jarn 2011-04-09 01:55:42

4

動態命名的功能是不是一個偉大的實踐。那這個呢?

function Ball(color, object) 
{ 
    // do stuff 
} 

,然後通過調用它:Ball('red', this);

+0

+1。不錯的選擇 - 我喜歡這個答案。 – 2011-04-09 01:23:32

+0

做任何事情的功能都不是很好的做法。 – icktoofay 2011-04-09 01:24:08

+0

我仍然會說動態函數名是一種不好的方法來實現那裏的邏輯。帶有其他函數調用的switch語句或者像Rfvgyhn(很難輸入)的方法可能會產生更多可維護的代碼。 – 2011-04-09 01:29:57

5

標隱含window對象:

window[color + 'Ball'](this) 

你舉的例子試圖調用字符串'Ball'(這是沒有意義的,因爲串AREN可調用),然後連接結果color - 不完全是你想要的。

+0

+1你打我40秒左右:) – JAAulde 2011-04-09 01:24:42

+0

@JAAulde:謝謝。偉大的思想家都認爲相同;-) – Cameron 2011-04-09 01:25:56

+0

@jarn:那麼這個錯誤意味着'redBall'不是全局命名空間中的函數(即在'window'對象上)。它在哪裏定義?在另一個功能?最重要的是,在你的情況下,這是什麼? – Cameron 2011-04-09 01:56:37

1

爲了避免對現有代碼進行任何修改(我假設是全球範圍的),你可以使用這個:

window[color + 'Ball'](this); 
+1

你必須展示更多的代碼,然後才能反映實際的上下文。 – JAAulde 2011-04-09 01:54:04