Javascript 如何将函数绑定到数组中的每个对象?

Javascript 如何将函数绑定到数组中的每个对象?,javascript,jquery,arrays,function,eval,Javascript,Jquery,Arrays,Function,Eval,问题标题可能不是很清楚,甚至不准确。然而,这就是我想要做的 我想要一个对象数组。每个对象都是一个按钮。我想将预定义的函数绑定到每个按钮。下面是代码示例 目前,我正在使用eval(),但我知道它速度很慢,而且由于安全原因被认为是一种不好的做法。它也不起作用,因为eval()函数将立即执行并调用已声明的两个函数 有人能告诉我实现目标的最佳方法是什么吗 谢谢只需将函数存储在数组中即可 var myArray = [{id:"bt1", value:"+", func: func1 },

问题标题可能不是很清楚,甚至不准确。然而,这就是我想要做的

我想要一个对象数组。每个对象都是一个按钮。我想将预定义的函数绑定到每个按钮。下面是代码示例

目前,我正在使用eval(),但我知道它速度很慢,而且由于安全原因被认为是一种不好的做法。它也不起作用,因为eval()函数将立即执行并调用已声明的两个函数

有人能告诉我实现目标的最佳方法是什么吗


谢谢

只需将函数存储在数组中即可

var myArray = [{id:"bt1", value:"+", func: func1 },
               {id:"bt2", value:"-", func: func2 }];
然后设置单击事件处理程序:

button.click(myArray[i].func);

只需将函数存储在数组中

var myArray = [{id:"bt1", value:"+", func: func1 },
               {id:"bt2", value:"-", func: func2 }];
然后设置单击事件处理程序:

button.click(myArray[i].func);
在这里为您修复了它:

基本上就像FishBasketGordo所说的存储函数一样,但是您还必须使用jQuery的
click
函数来绑定事件,而不是分配给
onclick
,因为它们是包装元素


var func1=function(){alert(“调用了函数1”);}
var func2=function(){alert(“调用了函数2”);}
var myArray=[{id:“bt1”,值:“+”,func:func1},
{id:“bt2”,值:“-”,func:func2}];
$(函数(){
对于(var i=0;i在这里为您修复了它:

基本上就像FishBasketGordo所说的存储函数一样,但是您还必须使用jQuery的
click
函数来绑定事件,而不是分配给
onclick
,因为它们是包装元素


var func1=function(){alert(“调用了函数1”);}
var func2=function(){alert(“调用了函数2”);}
var myArray=[{id:“bt1”,值:“+”,func:func1},
{id:“bt2”,值:“-”,func:func2}];
$(函数(){

对于(var i=0;i,您可以将代码缩短为如下所示:

var func1 = function() { alert("Function 1 is called");}
var func2 = function() { alert("Function 2 is called");}

    // changed property name ----------v
var myArray = [{id:"bt1", value:"+", click: func1},
               {id:"bt2", value:"-", click: func2}];

$(function(){
    $.each( myArray, function(i,v) {
       $('<input>',$.extend({},v,{type:"button"})).appendTo('#test');
    });
});

示例:

您可以像这样将代码缩短:

var func1 = function() { alert("Function 1 is called");}
var func2 = function() { alert("Function 2 is called");}

    // changed property name ----------v
var myArray = [{id:"bt1", value:"+", click: func1},
               {id:"bt2", value:"-", click: func2}];

$(function(){
    $.each( myArray, function(i,v) {
       $('<input>',$.extend({},v,{type:"button"})).appendTo('#test');
    });
});


示例:

这将使数组非常庞大且难以读取。如果该函数分散了几行怎么办?您可以在其他位置声明该函数,并将函数名放入数组中,正如我上面所说的。非常感谢FishBasket。它可以工作。顺便问一句,您知道写obj有什么区别吗?单击(function()){}和obj.bind('click',function(){})?感谢第一个是第二个的简写。功能上,它们是一样的。我建议阅读jQuery API文档:API.jQuery.com。它的信息量很大。@chepukha:
.bind()
允许您在事件对象上设置数据,该对象可通过
event.data.someProperty
访问。这将使数组非常庞大且难以读取。如果函数分散几行怎么办?您可以在其他位置声明函数,只需将函数名称放入数组中,就像我上面所说的那样。非常感谢FishBasket。它works.BTW,你知道写obj.click(function(){})和obj.bind('click',function(){})有什么区别吗?感谢第一个是第二个的缩写。从功能上来说,它们是一样的。我建议你阅读jQuery API文档:API.jQuery.com。它的信息量很大。@chepukha:
.bind()
确实允许您在事件对象上设置数据,该对象可以通过
event.data.someProperty
访问。非常感谢您的努力,Magnar。我接受了FishBasket,因为他早些时候回答了。但是您的JSFIDLE为+1。谢谢。关于
单击
与分配给
onclick
相比,您完全正确。我正在更正我的answer当你发布时。非常感谢你的努力,Magnar。我接受了FishBasket,因为他早些时候回答了。但是+1对于你的JSFIDLE。谢谢。你关于
单击
与分配给
onclick
的观点绝对正确。我在你发布时更正了我的答案。+1.非常感谢Patrick。你的回答非常有用。但是,我没有使用each()因为我需要控制每行按钮的数量(我的问题中没有包含该代码),例如每行3个按钮。因此,我猜每个()都不允许我这样做?!@chepukha:如果你说你需要在添加3个按钮后打破循环,那么只需添加
If(I==2)返回false;
$。每个
方法。当
i==2
时,它将
返回false
,并打破循环。我无法将此扩展作为更清晰的答案发布,因为我没有足够的声誉。抱歉。实际上,除了在用户单击时调用预定义函数之外,我还想做更多的事情由于闭包的原因,如果在匿名函数中使用myArray[I].func,“I”将等于“2”和myArray[I].func未定义。如何解决此问题?@chepukha:您需要创建一个新的变量作用域来捕获
I
的当前值。因为在函数中创建了一个新的变量作用域,所以您需要调用函数,将
I
传递给它,并让它返回一个函数作为处理程序。因为返回的函数是在同一范围内创建(函数)在传递
i
的地方,它将继续访问该
i
值。使用
$。每个
都是一个不错的方法,因为每次迭代都有一个引用
i
值的函数执行。在该
$内创建的任何函数。每个
都将继续访问
i
…下面是另一个er示例使用
$.each()
$中创建的单击处理程序。each()
函数引用
myArray[i].func
。因为
i
是该特定函数调用的参数,所以创建的处理程序将继续引用该特定的
i
+1。非常感谢Patrick。您的回答非常有用。但是,我没有使用each(),因为我需要控制每行按钮的数量(我的问题中没有包含该代码),例如每行3个按钮,以此类推