Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Аналог toggle в javascript? (https://javascript.ru/forum/events/23834-analog-toggle-v-javascript.html)

bes 04.05.2012 10:08

Не проще ли просто использовать некоторую внешнюю переменную как флаг, хранящий одно из пары значений (например, true/false или 0/1), если одно значение флага - исполняй одну функцию, второе - вторую, а при кликах просто изменять значение этого флага.

bes 04.05.2012 10:20

Например, так
<script>
var a = 0;
function toggle() {
if (a == 0) 
  {f1(); a = 1} 
else 
  {f2(); a = 0}
}
</script>

melky 04.05.2012 10:30

Цитата:

Сообщение от bes (Сообщение 172624)
Не проще ли просто использовать некоторую внешнюю переменную как флаг, хранящий одно из пары значений (например, true/false или 0/1), если одно значение флага - исполняй одну функцию, второе - вторую, а при кликах просто изменять значение этого флага.

Цитата:

Сообщение от bes (Сообщение 172625)
Например, так
<script>
var a = 0;
function toggle() {
if (a == 0) 
  {f1(); a = 1} 
else 
  {f2(); a = 0}
}
</script>

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

bes 04.05.2012 11:55

Цитата:

Сообщение от melky
в вышеупомянутой функции сделано без замыкания, и с возможностью последовательного (через клик) исполнения хоть тысячи функций.

Я и не критиковал ваш вариант решения, но в частном случае с двумя чередующимися функциями наверное проще сделать именно так.

melky 04.05.2012 12:08

Цитата:

Сообщение от bes (Сообщение 172633)
Я и не критиковал ваш вариант решения, но в частном случае с двумя чередующимися функциями наверное проще сделать именно так.

замыкания потребляют память. разница в [[scope]] (в случае замыкания) и в объекте (мой случай) небольшая, но есть.сейчас не то время, когда нужно экономить память, но всё-таки лучше придерживаться сильных сторон JavaScript, и не использовать его "источники огромной силы" в каждом скрипте (javascript:Сильные стороны, by Дуглас Крокфорд)

bes 04.05.2012 12:26

Цитата:

Сообщение от melky
замыкания потребляют память

Может я чего-то и не понимаю, но причём здесь вообще замыкания, здесь переменная создаётся не как локальная переменная функции toggle(), а как глобальная переменная, то есть эта переменная была, существует и будет существовать в одном своём экземпляре.

melky 04.05.2012 13:01

Цитата:

Сообщение от bes (Сообщение 172639)
Может я чего-то и не понимаю, но причём здесь вообще замыкания, здесь переменная создаётся не как локальная переменная функции toggle(), а как глобальная переменная, то есть эта переменная была, существует и будет существовать в одном своём экземпляре.

а, да. извиняюсь, просмотрел :) для одного-двух обработчиков так можно сделать, согласен. а что если таких тогглеров около 20 ?

bes 04.05.2012 13:45

Цитата:

Сообщение от melky
для одного-двух обработчиков так можно сделать, согласен. а что если таких тогглеров около 20

Тогда подойдёт оператор switch, а переменную-флаг увеличивать каждый раз на единицу (кроме самого последнего значения, которое надо обнулить).

bes 04.05.2012 14:34

//например, для 3 функций
var a = 0;
function toggle3() {
  switch (a) {
    case 0: {f1(); break}
    case 1: {f2(); break}
    case 2: {f3(); break}
  }
  if (a == 2) a = 0; else a = a + 1;
}


//или так
var a = 0;
function toggle3() {
  switch (a) {
    case 0: {f1(); break}
    case 1: {f2(); break}
    case 2: {f3(); break}
    default: {f1(); a = 0}
  }
  a = a + 1;
}

x-yuri 05.05.2012 23:14

Цитата:

Сообщение от melky
в коде в переменной ie будет true в ie<9 (если не ошибаюсь) - а сама она написана для использования ie api. в ie > 8 она будет false, а в них уже поддеживаются методы w3c.

всё схвачено

В ie <= 9, а по поводу 10-ой версии не совсем понятно. Но не то чтобы это так важно. Я просто недавно узнал об этом изменении, а потом на твой код наткнулся...

А вообще можно так


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