2015-01-25 6 views
0

Я хочу сделать это, не набирая код 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()); 
     }); 
+0

Почему каждый отдельный этаж имеет собственное событие 'on'? Должен быть один прослушиватель событий, и событие должно содержать информацию, на которую нажата кнопка, на которой пол. Тогда лифт может пойти на этот этаж. – deceze

+0

это игра: http://play.elevatorsaga.com/#challenge=3 Я не контролирую настройки :) – Poutrathor

ответ

1

Прежде всего, в

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

ввнутри функций всегда тот же объект, что тот, который инициирующее событие, поэтому я хотел бы изменить его, чтобы использовать 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 
}); 
+0

спасибо за дополнительные советы! – Poutrathor

1

Вы можете просто сделать использование Array.forEach и рефакторинг кода к ниже

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

Вы не делаете ничего конкретного, когда при up_button_pressed или down_button_pressed срабатывает, так что просто объединить эти события с помощью запятая.

1

вот мы идем ... сначала вы берете одну из своих функций, которые вам нужно повторить.

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 тоже)

Смежные вопросы