簡體   English   中英

為每個數組元素定義一個函數

[英]define a function for each array element

我想這樣做而無需編寫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());
        } );

您可以只使用Array.forEach並將代碼重構為以下內容

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

觸發up_button_presseddown_button_pressed時,您沒有做任何特定的事情,因此只需使用逗號組合這些事件即可。

我們開始...首先,您需要執行一個需要迭代的函數。

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

然后轉換代碼,以便代碼可以迭代(例如,循環)工作

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)

首先,在

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
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM