Я немного изменил версию, написанную ori . Я думаю, что такое поведение должно иметь осциллятор. Изменение знака приращения для отскока от границы - только часть того, что должно быть сделано, потому что это хорошо только для шага = 1. Пример - осциллятор между -2 и 3 с шагом 2. Код выше даст -2, 0, 2, 0, -2, 0, 2 и так далее.
Я думаю, это должно быть -2, 0, 2, 2 (1 шаг от 2 до 3 и 1 шаг к возвращению), 0, -2, 0 и т. Д. То же самое для (-4,4, 3). Это должно быть -4, -1, 2, 3, 0, -3, -1 и т. Д. (Исходный код даст -4, -1, 2, -1, -4, ..). Мое предложение (я также добавил еще одну проверку значений параметров)
function oscillator(low, high, inc) {
// basic test for illegal parameters
if (low > high || inc < 0 || 2 * (high - low) < inc)
return function() { return NaN; };
var curr = low;
return function() {
var ret = curr;
curr += inc;
if (curr > high || curr < low)
{
curr = inc>0 ? 2 * high - curr: 2 * low - curr;
inc = -inc;
};
return ret;
};
}