传递一个名为变量的函数引用

时间:2012-03-20 13:27:06

标签: javascript

我有以下javascript方法:

function 123_test_function(){

}

该函数由java生成并发送到客户端。 123是组件的id,因此它可以改变。即我可以使用另一个名为111_test_function()的函数 我想传递这个函数作为参考。

所以我需要创建引用

var 123_test_function = function 123_test_function(){

}

在对象内的另一个js文件中,我有一个需要使用123_test_function引用的函数,如下所示:

useFunction(123_test_function);

我遇到的问题是函数的123部分。 在这个对象中,我有一个变量(uniqueID),它在函数的开头有数字。 我需要函数调用类似于:

useFunction(uniqueID+"_test_function");

这似乎没有传递函数,而是传递一个字符串。 我做错了吗?

4 个答案:

答案 0 :(得分: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中没有使用。

答案 1 :(得分:0)

如果函数被定义为全局函数,它将是全局对象的成员(在浏览器的情况下为window)。因此,您只需window['id_'+uniqueID+'_test_function']即可访问您的功能

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

(标识符不能以JavaScript中的数字开头,所以我添加了'id_'前缀。您当然可以根据自己的喜好进行更改。)

答案 2 :(得分:0)

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

像这样调用函数

var func = test_function(1)
func();

答案 3 :(得分: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 at长度。应尽可能避免使用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]();