2012-03-20 102 views
0

我有以下JavaScript方法:由java的產生併發送至客戶端傳遞具有可變作爲其名稱的功能參考

function 123_test_function(){ 

} 

的功能。 123是組件的ID,所以它可以改變。即我可以有另一個功能叫做111_test_function() 我想傳遞這個函數作爲參考。

所以我需要創建參考

var 123_test_function = function 123_test_function(){ 

} 

在另一個js文件的對象我有需要使用123_test_function參考,像這樣的一個函數裏:

useFunction(123_test_function); 

我的問題m具有的是其中的部分功能。 在這個對象中,我有一個變量(uniqueID),它在函數的開始處有一個數字。 我需要的函數調用是這樣的:

useFunction(uniqueID+"_test_function"); 

這似乎並沒有傳遞一個函數,而不是它傳遞一個字符串。 我做錯了什麼?

+8

[標識符不能以數字開頭(http://es5.github.com/#x7.6) – 2012-03-20 13:28:20

+0

不好意思啊,我用123作爲一個例子對於這篇文章,但變量實際上並不是一個數字。 – Decrypter 2012-03-20 13:35:14

回答

3

比如,標識符(例如函數名稱)不能以數字開頭。

解決您的問題,使用對象,像這樣:

// 1. define an object to hold all your functions 
var allFunctions = {}; 

// 2. store any function with a unique string as the ID 
allFunctions['123_test_function'] = function() { 
    // whatever 
}; 

// 3. call the function 
allFunctions['123_test_function'](); 
allFunctions[uniqueID + '_test_function'](); 

對象是關聯數組。它們存儲鍵/值對,因此它們按照您的要求進行操作。

注意功能不需要在JavaScript中的名字,所以我沒有在步驟2中

0

如果函數被定義爲全局函數,它將是全局對象的成員(在瀏覽器情況下爲window)。因此,你可以做window['id_'+uniqueID+'_test_function']來訪問你的函數

useFunction(window['id_'+uniqueID+'_test_function']) 

(標識符不能用在JavaScript數字開頭,所以我說的'id_'前綴。當然,你可以把它改成自己的喜好。)

+0

關於這個問題,這是正確的答案! 此示例還正確地在函數名稱的變量或函數名稱不應以數字開頭之前預先添加一個字符串 – elmuchacho 2012-03-20 14:28:52

0
function test_function(number){ 
    if(number == 1) 
    { 
    return function() {} 
    } 
    if(number == 2) 
    { 
    return function() {}  
    } 
} 

像這樣調用函數

var func = test_function(1) 
func(); 
0

使用上作爲一對夫婦的人正確地指出,一個函數(或者實際上變量)名稱不能開始與數字。另外這個語法是錯誤的:

var 123_test_function = function 123_test_function(){ 
} 

正確的語法是:

var 123_test_function = function() { 
}; 

...雖然還應當指出的是,這樣做的效果是完全一樣的「傳統」

function 123_test_function() { 
} 

...聲明,window對象的上下文中 - 由於window實際上是瀏覽器中JS環境的全局範圍,因此定義函數的方式並不重要,它們始終可以從任何位置訪問。準確理解在Javascript中聲明函數的每種方法意義重大 - 幸運的是,Douglas Crockford to the rescue再次...

人們已經提出了各種從字符串上下文中調用命名函數的方法,它基本上試圖使用「可變變量」語法,這個主題已被詳細討論過on SOelsewhere。應儘可能避免使用eval()方法 - 如果您發現自己需要一個eval()機會,您可能會在某個地方出現問題。 @Tomalak有一個正確的想法,在一個對象中保存了一組函數,但是這仍然需要稍微混亂的字符串方法來引用實際上由數字ID訪問的東西。收集方法的優點是不會將window對象與可能是單個/零使用成員的對象混淆在一起。

但是我看到它的方式,這裏實際需要的是一個索引函數數組,其中您需要的只是數字索引以訪問它們。我建議你創建你的函數是這樣的:

// Do this once at the top of your JS 
var test_functions = []; 

// Now, for each function you define: 
test_functions[123] = function() { 
    // Do stuff here 
}; 

// And when you need to call the functions: 
var funcId = 123; 
test_functions[funcId]();