#javascript #reduction
#javascript #сокращение
Вопрос:
Могу ли я уменьшить
function n()
{
var a;
if(a = document.getElementById('fb0'))
{
a.onclick = i0;
document.getElementById('fb1').onclick = i1;
}
}
Для
function n()
{
if(document.getElementById('fb0').onclick = i0)
{
document.getElementById('fb1').onclick = i1;
}
}
У меня сейчас нет отладчика. Я знаю, что document.getElementById('fb0')
возвращает значение, потому что первый фрагмент работает нормально. Но нужно ли, чтобы присваивание оценивалось в операторе if?
Комментарии:
1. Вы намеренно пытаетесь выполнить присваивание в вашем условном обозначении? Или это ошибка двойного равенства?
Ответ №1:
Нет, вы не можете.
document.getElementById('fb0')
, как уже сказано в названии функции, возвращает html element
с идентификатором, равным fb0
. После этого вы получаете доступ к атрибуту onclick
. Но при сбое get это приведет к поломке скрипта.
В первом сценарии вы проверяете, работает ли назначение, если работает, это означает, что элемент существует и будет выполняться только в том случае, если он существует.
Это разные варианты поведения.
Ответ №2:
Не совсем; если getElementById('fb0')
ничего не возвращает, ваша страница получит сообщение об ошибке, а в первом случае этого не было бы.
Комментарии:
1. В качестве дополнительного примечания я бы настоятельно рекомендовал не использовать «хитрости» для минимизации JS, включая назначение в условии — это, вероятно, вызовет головную боль при последующем обслуживании. Вы можете использовать какой-нибудь JS minifier, если вас беспокоит размер загрузки.
2. Это удаляет некоторые ненужные пробелы / комментарии, иногда сокращает имена переменных, и потенциально может (хотя я не знаю, делают ли это существующие) применить некоторые изменения кода, которые не меняют семантику программы, все для уменьшения размера файла JS. Некоторые примеры находятся по адресу crockford.com/javascript/jsmin.html или aspnet.codeplex.com/releases/view/34488
Ответ №3:
Чтобы проверить, возвращает ли «document.getElementById(‘fb0’)» элемент или null, вторая версия этого не делает, и будет выдана ошибка, если нет элемента с идентификатором «fb0». Вторая версия подойдет, если вы в какой-то момент не удалите элемент «fb0» из DOM.
Ответ №4:
Это не сработало бы, если бы document.getElementById('fb0')
не существовало. document.getElementById('fb0').onclick
в этом случае это мало что значило бы.
Ответ №5:
Если вы часто выполняете выбор DOM по идентификатору, создайте сокращенную версию этого метода:
function byId( id ) { return document.getElementById(id); };
function n() {
var a;
if(a = byId('fb0')) {
a.onclick = i0;
byId('fb1').onclick = i1;
}
}
В этом случае выполнение присваивания внутри условия не экономит вам никаких символов. Это та же длина, что и для объявления.
function byId( id ) { return document.getElementById(id); };
function n() {
var a = byId('fb0');
if(a) {
a.onclick = i0;
byId('fb1').onclick = i1;
}
}
Комментарии:
1. Вы должны взвесить стоимость второй функции в сравнении с сохраненными символами. Правильно?
2. @Chris Aaker: Безусловно. Но если вы не выполняете какой-то безумный выбор DOM в цикле или что-то в этом роде, вы никогда не заметите разницы. И, на мой взгляд, вам действительно следует просто использовать этот метод один раз для любого заданного элемента. Если этот же элемент понадобится снова, вам следует кэшировать результат. Так, например, если какой-то элемент извлекается в функции, вы бы кэшировали его при первом вызове функции, а последующие вызовы использовали бы кэшированный элемент.