ПРИМЕЧАНИЕ. Обновлено и перезаписано
Этот вопрос был переделан и обновлен. Пожалуйста, извините устаревшие ссылки ниже. Спасибо.
В последнее время я видел много javascript-кода, что выглядит неправильно для меня. Что я должен предлагать в качестве лучшей схемы кода в этой ситуации? Я воспроизведу код, который я видел, и краткое описание для каждого из них:
Блок кода # 1
Этот код никогда не должен оценивать внутреннюю функцию. Программисты будут запутаны, потому что код должен работать.
$(document).ready( function() {
return function() {
/* NOPs */
}
});
Кодовый блок # 2
Программист, вероятно, намерен реализовать функцию самозапускания. Они не полностью завершили реализацию (они не хватает ()
в конце вложенного пэра. Кроме того, поскольку они ничего не делают во внешней функции, вложенная функция самозапуска может быть просто встроена в определение внешней функции.
Собственно, я не знаю, что они намереваются использовать функцию self invoking, потому что код по-прежнему не прав. Но, похоже, им нужна функция self-invoking.
$(document).ready( (function() {
return function() {
/* NOPs */
}
}));
Блок кода # 3
Опять появляется, что программист пытается использовать функцию самозапуска. Однако в этом случае это слишком много.
$(document).ready( function() {
(return function() {
/* NOPs */
})()
});
Блок кода # 4
примерный кодовый блок
$('#mySelector').click( function(event) {
alert( $(this).attr('id') );
return function() {
// before you run it, what the value here?
alert( $(this).attr('id') );
}
});
Комментарий:
Я думаю, что я просто разочарован, потому что он вызывает ошибки ползучести, которые люди не понимают, изменения показывают, что они не grokking, и вообще делает действительно странный код. Это все из какого-то набора учебников? Если мы собираемся научить людей писать код, можем ли мы научить их правильному пути?
Что вы предлагаете в качестве точного учебника, чтобы объяснить им, почему код, который они используют, неверен? Какой шаблон вы предложите, чтобы они учились вместо этого?
Все образцы, которые я видел, которые заставили меня задать этот вопрос, были на SO как вопросы. Здесь самый последний фрагмент, с которым я столкнулся, демонстрирует такое поведение. Вы заметите, что я не размещаю ссылку на вопрос, так как пользователь кажется довольно новичком.
$(document).ready(function() {
$('body').click((function(){
return function()
{
if (counter == null) {
var counter = 1;
}
if(counter == 3) {
$(this).css("background-image","url(3.jpg)");
$(this).css("background-position","10% 35%");
var counter = null;
}
if(counter == 2) {
$(this).css("background-image","url(2.jpg)");
$(this).css("background-position","10% 35%");
var counter = 3;
}
if(counter == 1) {
$(this).css("background-image","url(1.jpg)");
$(this).css("background-position","40% 35%");
var counter = 2;
}
}
})());
});
Вот как я предложил переписать свой код:
var counter = 1;
$(document).ready(function() {
$('body').click(function() {
if (counter == null) {
counter = 1;
}
if (counter == 3) {
$(this).css("background-image", "url(3.jpg)");
$(this).css("background-position", "10% 35%");
counter = 1;
}
if (counter == 2) {
$(this).css("background-image", "url(2.jpg)");
$(this).css("background-position", "10% 35%");
counter = 3;
}
if (counter == 1) {
$(this).css("background-image", "url(1.jpg)");
$(this).css("background-position", "40% 35%");
counter = 2;
}
});
});
Заметьте, что я на самом деле не говорю, что мой код лучше. Я удаляю только анонимную промежуточную функцию. Я действительно знаю, почему этот код изначально не делает то, что он хочет, и я не занимаюсь переписыванием всего кода, который приходит, но я действительно хотел, чтобы у человека был хотя бы полезный код.
Я подумал, что оценка для реального кода будет оценена по достоинству. Если вы действительно хотите ссылку на этот конкретный вопрос, напишите мне по этому нику. Он получил несколько действительно хороших ответов, из которых мой был в лучшем случае среднего класса.