如何在数组变量中运行函数数组

时间:2012-11-17 04:39:01

标签: javascript jquery

我正在尝试运行我放在变量上的一系列函数。

这是一个( demo

代码:

function pass_me(x) {
    alert(x);        
};

var colors = new Array();
var colors = ["pass_me('yellow');", "pass_me('green');", "pass_me('blue');"]

for(var i = 0; i <= colors.length; i++) {
    window[colors[i]]();
}​

不幸的是,我无法让它运行。知道我的代码有什么问题吗?

由于


函数数组变量背后的故事,是因为我从动态元素中复制了它。这样它只会运行页面中已有的功能。因此,如果不存在pass_me(“red”),则不会运行它。

示例:

<img src="img/something.jpg" ondblclick="pass_me("yellow")" />
<img src="img/something.jpg" ondblclick="pass_me("green")" />
<img src="img/something.jpg" ondblclick="pass_me("blue")" />

然后我只使用:

jQuery("td img").each(function(){
colors.push(jQuery(this).attr("ondblclick"));
})

6 个答案:

答案 0 :(得分:1)

如果你想执行一个javascript字符串,你必须使用eval来告诉javascript将你的字符串解析成javascript。这通常不是编写javascript的最佳方式。

为避免使用eval,我建议:

function pass_me(x) {
    alert(x);        
};

var colors = ["yellow", "green", "blue"];

for(var i = 0; i <= colors.length; i++) {
    pass_me(colors[i]);
}​

或者,如果你真的想把这个函数放在数组中,这样你就可以在数组中使用不同的函数,你可以这样做:

function pass_me(x) {
    alert(x);        
};

var colors = [{fn:pass_me, color: "yellow"}, {fn:pass_me, color: "green"}, {fn:pass_me, color: "blue"}];

for(var i = 0; i <= colors.length; i++) {
    colors[i].fn(colors[i].color);
}​

答案 1 :(得分:1)

demo

function pass_me(x) {
    alert(x);        
}

var colors = ["yellow", "green", "blue"];

for(i = 0; i < colors.length; i++) {
    pass_me(colors[i]);
}

答案 2 :(得分:1)

将数组成员更改为这样的处理程序:

function pass_me(x) {
    alert(x);        
};

var colors = [{ handler: pass_me, args: ['yellow'] }, { handler: pass_me, args: ['green'] }, { handler: pass_me, args: ['blue'] }];

for(var i = 0; i < colors.length; i++) {
    colors[i].handler.apply(this, colors[i].args);
};

这样,您可以在同一个数组中拥有多个处理程序,每个处理程序具有不同的参数。 或者在调用成员之前初始化成员,因为成员的数据类型是字符串,而不是Function。像这样:

function pass_me(x) {
    alert(x);        
};

var colors = ["pass_me('yellow')", "pass_me('green')", "pass_me('blue')"];

for(var i = 0; i < colors.length; i++) {
    eval(colors[i]);
};

希望它对你有所帮助。

干杯

答案 3 :(得分:1)

在这里使用eval可能是安全的,但这是另一个解决方案,我个人觉得它更清洁:

事件处理程序通过HTML属性绑定。大多数HTML属性值是相应DOM属性值的基础。在这种情况下,每个img DOM元素都有一个属性ondblclick,函数体是HTML属性的值。

含义HTML等同于:

imgElement.ondblclick = function() {
    pass_me('yellow');
};

因此,如果你想“收集”这些函数,你只需要获得对事件处理程序的引用:

var handlers = jQuery("td img").map(function(){
    return this.ondblclick;
}).get();

稍后再打电话给他们:

for(var i = 0, l = handlers.length; i < l; i++) {
    handlers[i]();
}

然而如果你只是想在没有实际点击图片的情况下执行所有处理程序,你只需触发它们上的事件:

jQuery("td img").trigger('dblclick');

这将执行dbclick事件的所有事件处理程序。

答案 4 :(得分:0)

你需要尝试

eval(colors[i]);

因为它是一个字符串而不是一个函数

答案 5 :(得分:0)

也许您正在寻找匿名函数:

function pass_me(x) {
    alert(x);        
}

var colors = [
    function(){ return pass_me('yellow'); }, 
    function(){ return pass_me('green'); },
    function(){ return pass_me('blue'); }
];

for(var i = 0; i < colors.length; i++){
    colors[i]();
}