Давно хотел уже "выкрикнуть душою", а тут предоставился удобный случай. Итак курс лекций "Вселенское твердолобие. Методы борьбы.".
Заборы в коде.
Вот cтрочка кода из первого попавшегося поста:
setTimeout('setOpacity(\''+obj+'\', '+i+')',50*i);
Вот кто может объяснить наличие этих треклятых наклонных реек? Тут виноватого, мне кажется, не найти. Эти заборы встречаются практически в каждой бумажной(и не только) книжонке связанной с программированием. Смело желаю их авторам жидко обосраться… Запоминаем (а лучше записываем): в нашем распоряжении имеется два вида «кавычек» – (' и "), и властью данной мн ой не так во имя чита вы вольны их использовать в произвольном порядке.
setTimeout('setOpacity("'+obj+'", '+i+')',50*i);
Прежде чем нарисовать забор пойдите выпейте чаю. Если желание не прошло – налейте ещё…
Аналогичный же случай с pcre – развею миф о том, что ограничителями регулярного выражения могут быть только заборные рейки? Сравните:
$re = '/(\d{2})\/(\d{2})\/(\d{4})/';
и
$re = '~(\d{2})/(\d{2})/(\d{4})~';
P.S.
Раз уж я доколебался до несчастной строчки с таймаутом, завершу атаку на твердолобие контрольным ударом с обоих флангов.
Опять-таки луч кровавого поноса тому, кто научил вас передавать аргументом в setTimeout строку, тогда как по уму передать надо функцию.
setTimeout(function(){setOpacity(obj,i);},50*i);
И никогда более не пишите setTimeout("func()",100);, иначе у вас будут ломкими ногти, появиться перхоть и насмерть замучают кариозные монстры.
setTimeout(func,100);
P.P.S.
Я надеюсь NoNseNs не примет близко к сердцу данный опус и поймёт всё правильно. Спасибо за внимание.
Извольте, всегда рад услышать мнение о своем коде 🙂
По поводу кавычек – я всегда стараюсь использовать одинарные кавычки, кроме случаев совсем сложных, когда приходится использовать \\’ двойную черту перед кавычкой, тогда уже я использую двойную. Просто чтобы не запутаться, такой у меня подход… врятли это может считаться не грамотным.
А по поводу setTimeout – его аргумент передается именно как строка. Об этом написано в любом мануале. Попробуй в моем коде передать аргумент этой функции как другую функцию и получишь ошибку. Надеюсь, понос все же не посетит бедных авторов 🙂
О кавычках: ты понимаешь что делаешь, и пишешь так как считаешь нужным… это похвально, неграмотным я это не считаю.
Я считаю это элементарным неуважением к тому, кто будет читать твой код.Байта ради – не учите возводить ограды других.
Ведь многие
сопливые юнцыначинающие программисты даже не подозревают, что код можно не только писать, но и ЧИТАТЬ – для них эти заборы это единственный вариант написания кода, т.к. других примеров просто нет…А теперь о setTimeout (я надеюсь мы понимаем что речь не только о таймаутах, а о callback-ах в js вообще):
Откроем MSDN
Откроем MDC
Только в msdn (а вовсе не в любом мануале) упомянуто, что может быть строка, но сначала написано – это указатель на функцию (зачем лишний раз делать eval
и строить слешовые заборы?)…Я не понял как,что, где и когда в твоём коде надо что-то передать, чтобы он перестал работать, но готов исправить нерабочий код, который ты приведёшь.
А после этого мы вместе порадуемся за авторов оффлайн-мануалов – у них более выигрышная позиция, т.к. имеется целая стопка туалетной бумаги.
передают строку, т.к. не понимают что функция тоже объект 🙂
Про RE:
re = /(\d{2})\/(\d{2})\/(\d{4})/;
Ты зачем там кавычки поставил??? убери сейчас же!!!
просто кодом
re = '~(\d{2})/(\d{2})/(\d{4})~';
ты создаешь строку и методы доступные для RE уже работать не будут.
Другой вопрос, что в языках типа Perl, Ruby (к JS это не относится там только слеши см. MDC) и т.п. RE не обязательно задавять в слешах, а можно использовать любой отделяющий символ (я использую #), либо спец. конструкции типа qr(), и тогда экранировать нужно уже этот отделяющий символ.
PHP там я имел ввиду, а не JS, поэтому кавычки…
ну что же посмотрим туда, куда нас носом тыкают…
MSDN
почти во всех примерах постоянно используется передача строки
window.setTimeout(“fnHide2(” + oToHide.id + “)”, 3000);
в определении функции сказано “Variant that specifies the function pointer or string that indicates the code to be executed when the specified interval has elapsed.” что значит “Функция или строка, задающая код, который будет выполнен по истечении времени интервала”
Функция или СТРОКА, т.е. оба варианта абсолютно верны. При этом при передачи функции нельзя передавать аргументы в IE… попробуй сам, будет выдана ошибка.
Так что будет правильнее, передать функцию без аргументов или нормальную строку с аргументами? И пофигу на eval если работает везде.
ещё раз прошу – дайте мне пример, который по вашему разумению не будет работать в IE.
А приведённая строка, должна выглядеть так:
window.setTimeout(function(){ fnHide(oToHide.id);},3000)
“и пофигу на…” – собственно об это я и пишу – хочется не мира на всей земле, а для начала порядка в отдельно взятом кусочке пространства (хоть и виртуального)…
Такой вариант будет работать… однако вызывается лишняя анонимная функция.
Хотя тут тоже свои плюсы – работает без eval.
Это только доказывает, что есть множество способов сделать одно и тоже действие.
А все писать под линейку думаю врят ли будут 🙂
Да способов масса
но мой кунг-фу сильнее.Был рад развеять ещё один миф. Вроде бы технически-грамотные все, а имеете туеву хучу суеверий, примет и гаданий на random…
И Байт с ней, с анонимной функцией – насколько проще это писать и читать…
Когда стоят три кавычки “‘ уже очень понятно две их там или три. А вот с заборами всё понятно 🙂
Т.е. очень не понятно.
К пред. посту 🙂
Допускаю что у вас что-то очень не понятно.
Видимо мне повезло с выбором шрифта в используемых редакторах…