JavaScript. Техника программирования с использованием флагов.
Программирование на JavaScript имеет один серьезный недостаток - необходимо постоянно думать о совместимости в различных версиях браузера. Очень часто, приходится писать несколько вариантов реализации одного и того же алгоритма. Проверять каждый раз под каким браузером запущен код - занятие нелепое! Удобно в начале выполнения скрипта определить флаги, по которым определять поддерживает браузер то или иное свойство, например, чтобы определить поддерживает ли браузер DOM, вводим такой флаг:
или проверку на запуск в ослике:
Кстати, обратите внимание на использование двойного отрицания - “!!”, делается для приведения к булевому типу (на выходе true, false).
В больших скриптах можно ввести некоторое подобие пространства имен (namespace):
w3: function() {
return !!(document.getElementById && document.createElement);
}(),
ie: function() {
return !!window.ActiveX;
}()
};
Вопрос на самопроверку: “Зачем ставятся две круглые скобки после определения функции в последнем примере (function(){…some code…}()?”
Различных полезных флагов может быть бесконечно множество. Предлагаю в комментариях добавлять свои интересные варианты, которые могут быть полезны другим!
Slach
Гость
а действительно ? зачем они ставятся скобки то??
никогда раньше при такой нотации их не ставил, работало нормально, объясните если не трудно?
Evgeny Sergeev
Веб-разработчик, автор блога codeart.ru
Скобки ставятся для того, чтобы неявно заданная функция сразу выполнилась. Обратите внимание, что в функции стоит return, т.е. флагу присовется не функция, а значение которое вернется в результате работы.
Приведу пару примеров:
1 Значение функции определяется один раз:
s1: function(){return ‘Flag S1′;}()
}
alert(FLAGS.s1);
alert(FLAGS.s1);
alert(FLAGS.s1);
2. Значение функции пересчитывается каждый раз:
s1: function(){return ‘Flag S1′;}
}
alert(FLAGS.s1());
alert(FLAGS.s1());
alert(FLAGS.s1());
Алексей
Гость
простите но нафига такие сложности со скобками? Ну если бы нужно было не сразу значение вычислить а только при первом вызове, хотя всеравно сработает сразу…
var FLAGS = {
‘w3′: !!(document.getElementById && document.createElement),
‘ie’: !!window.ActiveX
};
и никаких излишеств. Ключ хеша лучше как строку передавать, а то вдруг у Вас переменная с таким именем есть… будете мучительно искать ошибку
Evgeny Sergeev
Веб-разработчик, автор блога codeart.ru
1. Для простых выражений действительно неоправдано использовать функции, но хотелось сделать акцент как раз на возможность присвоения результата выполнения функции.
2. При определении хеша, на сколько я знаю, путаницы быть не должно, но при обращении к хэшу возможна ошибка. Поясняющий пример:
var FLAGS = {
ie : true
}
FLAGS[ie] = false;
alert(FLAGS[ie]);
alert(FLAGS.ie);
alert(FLAGS['ie']);
3. Не совсем понятно, что Вы хотели сказать фразой: “…хотя всеравно сработает сразу…”
RayZ
Гость
А где об этом можно почитать поподробнее? Не явно и не до конца понятно.
Evgeny Sergeev
Веб-разработчик, автор блога codeart.ru
RayZ, можешь задать конкретный вопрос, что не понятно? Так как я не могу назвать конкретный источник где можно прочитать более подробно!