为每个数组元素定义一个函数

时间:2015-01-25 11:19:49

标签: javascript arrays

我想在不编写X代码的情况下这样做。你是如何用JavaScript做的?我来自Java。

        floors[0].on("up_button_pressed", function() { 
            elevator.goToFloor(floors[0].floorNum());
        } );
        floors[0].on("down_button_pressed", function() { 
            elevator.goToFloor(floors[0].floorNum());
        } );

        floors[1].on("up_button_pressed", function() { 
            elevator.goToFloor(floors[1].floorNum());
        } );
        floors[1].on("down_button_pressed", function() { 
            elevator.goToFloor(floors[1].floorNum());
        } );

        floors[2].on("up_button_pressed", function() { 
            elevator.goToFloor(floors[2].floorNum());
        } );
        floors[2].on("down_button_pressed", function() { 
            elevator.goToFloor(floors[2].floorNum());
        } );        

        floors[3].on("up_button_pressed", function() { 
            elevator.goToFloor(floors[3].floorNum());
        } );
        floors[3].on("down_button_pressed", function() { 
            elevator.goToFloor(floors[3].floorNum());
        } ); 

        floors[4].on("up_button_pressed", function() { 
            elevator.goToFloor(floors[4].floorNum());
        } );
        floors[4].on("down_button_pressed", function() { 
            elevator.goToFloor(floors[4].floorNum());
        } );

3 个答案:

答案 0 :(得分:1)

您可以使用Array.forEach并将您的代码重构为以下

floors.forEach(function(floor){
    floor.on('up_button_pressed,down_button_pressed', function(){
       elevator.goToFloor(floor.floorNum());
    });
});

当触发up_button_presseddown_button_pressed时,您没有做任何具体的事情,所以只需使用逗号组合这些事件。

答案 1 :(得分:1)

我们走了...... 首先,你需要一个你需要迭代的函数。

floors[0].on("up_button_pressed", function() { 
        elevator.goToFloor(floors[0].floorNum());
    } );

然后转换该代码,以便代码可以在迭代中工作(例如for循环)

for(var i=0; i<x; i++){
floors[i].on("up_button_pressed", function(i) { 
    elevator.goToFloor(floors[i].floorNum());
}, i ); }

我在casperjs上这样做,但我认为这也适用于普通的javascript ...(因为casperjs也是javascript)

答案 2 :(得分:1)

首先,在

floors[0].on("up_button_pressed", function () { 
     elevator.goToFloor(floors[0].floorNum());
});

函数内的floors[0]始终与触发事件的对象相同,因此我将其更改为使用this

floors[0].on("up_button_pressed", function () { 
        elevator.goToFloor(this.floorNum());
});

然后,只需使用forEach

对所有楼层进行此操作
floors.forEach(function (floor) {
    floor.on("up_button_pressed", function () {
        elevator.goToFloor(this.floorNum());
    });
    // same for "down_button_pressed" here
});

由于处理函数不需要访问外部变量floor并使用this,您甚至可以在循环中定义它们并按名称使用它们,如果您愿意的话:

function onFloorUp() {
    elevator.goToFloor(this.floorNum());
}
// same for onFloorUp

floors.forEach(function (floor) {
    floor.on("up_button_pressed", onFloorUp);
    // same for "down_button_pressed" here
});