Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Проверка в замыкании (https://javascript.ru/forum/dom-window/64185-proverka-v-zamykanii.html)

hujak_hujak 25.07.2016 10:44

Проверка в замыкании
 
Здравствуйте, скажите, как сделать проверку в замыкании.
Нужно чтобы при каждом вызове var generator = sequence(10,3) начальное число увеличивалось на шаг
var generator = sequence(10,3) // 10
var generator = sequence(10,3) // 13
var generator = sequence(10,3) // 16
var generator = sequence(10,3) // 19

Сделал так:
function sequence(x,y) {
    var result = x ;
        return function () {
            return result+=y;
        }

}

Но проблема, первое число выходит 13, а должно 10. Как сделать проверку?

Я пытался так:
function sequence(x,y) {
    var result = x ;
    var c = true;

    if (c) {
        c = !c;
        return function () {
            return result;
        }
    }
    else {
        return function () {
            return result +=y;
        }
    }

}

Но это не работает, почему не понимаю

рони 25.07.2016 10:56

hujak_hujak,
<script>
function sequence(x,y) {
    var result;
    sequence = function () {
            return result += y
        }
    return result = x;
}
for (var i=0; i<4; i++)  {document.write(sequence(10,3) + '<br>')}
  </script>

hujak_hujak 25.07.2016 11:03

А generator то при вызове не обновляется

рони 25.07.2016 11:08

Цитата:

Сообщение от hujak_hujak
А generator то при вызове не обновляется

не понимаю

hujak_hujak 25.07.2016 11:12

Ну, задание что бы я вызывал generator() - вот так, а он мне выдавал постоянно разные числа.

generator() // 10

generator() // 13

generator() // 16

generator() // 19

hujak_hujak 25.07.2016 11:16

Криво наверное написал 1е сообщение

Задача: реализовать функцию sequence, которая будет увеличивать число 10 на шаг 3.
var generator = sequence(10,3)
Т.е :
generator () // 10
generator () // 13
generator () // 16
generator () // 19
Мое решение :
var generator = sequence(10,3)
function sequence(x,y) {
    var result = x ;
        return function () {
            return result+=y;
        }

}

Но тут начинается не с 10, а с 13. А мне нужно чтобы первый вызов ровнялся 10, а я не могу этого сделать

vadim5june 25.07.2016 11:43

Так попробуйте
var c =result;result+=y;return c

hujak_hujak 25.07.2016 11:58

Ничего не выходит, самое обидное, что в пятницу я решил эту задачку, а сегодня хоть убей, не могу, 3 часа уже мучаюсь)

рони 25.07.2016 11:58

hujak_hujak,
<script>
function sequence(x,y) {
    var result;
    return function () {
            return result ? result += y : result = x
        }
}
var generator = sequence(10,3);
for (var i=0; i<4; i++)  {document.write(generator()+ '<br>') }
  </script>

Vlasenko Fedor 25.07.2016 23:36

<script>
function* sequence(a, b) {
    while (true) {
        yield(a);
        a += b;
    }
}

var generator = sequence(10, 3);
document.write(generator.next().value + '<br>');
document.write(generator.next().value + '<br>');
document.write(generator.next().value + '<br>');
</script>

демонстрация :)


Часовой пояс GMT +3, время: 22:58.