jQuery slide show-почему этот код работает?
Я был в середине кодирования слайд-шоу на javascript с помощью jquery, когда я столкнулся с чем-то, что делало мои несколько строк кода в паре строк.
Проблема в том, что я не понимаю, как это работает, поэтому я могу изменить его.var imgs = [
'image1.jpg',
'image2.jpg',
'image3.jpg'];
var cnt = imgs.length;
$(function() {
setInterval(Slider, 4000);
});
function Slider() {
$('#imageSlide').fadeOut("slow", function() {
$(this).attr('src', imgs[(imgs.length++) % cnt]).fadeIn("slow");
});
}
Вот строчка, которая меня заводит:
[(imgs.length++) % cnt]
Я читаю это как
3+1 % 3 = 1
Теперь каждый раз, когда он выполняется, ни один из этих кодов не изменяет ни одну из переменных.
cnt
всегда будет равно imgs.length
(3), imgs.length++
на самом деле не изменяет его, он просто добавляет один для этого единственного выполнения, правильно?
Поэтому неважно, сколько раз он выполняется, он всегда будет imgs[1]
, но когда я выполняю код, он правильно проходит через все объекты массива.
Редактировать:
Я просто добавил alert(imgs.length);
и подтвердил, что ++
действительно изменяет переменную, но это все еще не имеет смысла для меня.
Первый запуск, imgs.length = 4
после ++. 4 % 3 = 1
поэтому он должен запускать array object [1]
не [0]
?
Второй заход, 5 % 3 = 2
Третий заход, 6 % 3 = 0
И т. д.. но он никогда не должен сбрасываться. Однако, если я ставлю alert(imgs.length % cnt);
, он возвращает только 0, 1, 2, чем сбрасывает.
Почему?
6 ответов:
Возвращаемое значение
imgs.length++
равно 3, следовательно, 3% 3 = 0, ноimgs.length
будет4
, а массивimgs
будет содержать элементы4
.Попробуйте в консоли:
var x = [ 1, 2, 3 ] x.length++ => 3 x.length++ => 4 x.length++ => 5 x [1, 2, 3, undefined, undefined, undefined]
Поэтому каждый раз, когда
imgs.length++
вызывается itt, он добавляет один элемент в массив. так что не хороший код, но короткий:)EDIT : Почему легко ответить, в начале он содержит
cnt
количество элементов, поэтому код будет наступать на каждое изображение и начинается с его начала. так что если массивimgs
содержит элементы5
он пройдет через элементы5
и начнет с самого начала.Единственная проблема с этим кодом, что массив будет увеличиваться каждый раз, и память будет съедена браузером.
Я уверен, что вы знаете, что
imgs.length++
, если бы он был применен к любой другой переменной, добавил бы к ней одну, изменив исходную переменную.Конечно, именно это и происходит.var x = 1; alert(x++); // alerts 1 alert(x); // alerts 2
Скрипт увеличивает длину массива
imgs
при каждом запуске, поэтому он перемещается от 3 до 4, от 5 до 6 и т. д. Я не эксперт по внутренним функциям Javascript, поэтому я не уверен, что это как-то влияет на производительность, но если вы понимаете, чтоlength
На самом деле является доступным для записи свойством, все это делает чувство.
(imgs.длина++) % cnt
Заставит образы повторяться через каждое изображение снова и снова.
Знак процента ( % ) в JavaScript означает, что он использует оператор Modulus (остаток от деления).
Примеры:
- 0 % 3 = 0
- 1 % 3 = 1
- 2 % 3 = 2
- 3 % 3 = 0
- 4 % 3 = 1
- 5 % 3 = 2 и т.д...
Ну, каждая 4-я секунда, которую запускает функция Slider, расширяет массив, так что вы получаете:
3+1 % 3 = 1 4+1 % 3 = 2 5+1 % 3 = 0
И так далее:)
Я не уверен на 100% в javascript, но каждый другой язык, который я знаю
Я бы счел это "умным трюком", который должен быть задокументирован, если он вообще используется.imgs.length++
, это то же самое, что сказатьimgs.length = imgs.length + 1
, так что это должно быть изменено.это как бы ломает семантику того, что означает длина, поэтому, хотя логически правильно для компьютера, это не совсем имеет смысл в отношении имени свойстваТак что я думаю, что он действительно меняет длину, но я все равно не рекомендовал бы использовать его без документирование этого. Более ясным методом было бы объявить новый var
i = 0
и заменитьimgs.length++
наi++
, потому что, хотя это, вероятно, не имеет значения в этом случае, если вы делаете что-то еще с массивом, длина теперь, вероятно, не та, что вы ожидаете.Что касается редактирования:
6 % 3 - это 0, а не 3.
Модуль (в программировании, немного отличающийся чисто математическим термином) означает деление и взятие остатка.
6 / 3 = 2 с остатком 0.
7 / 3 = 2 с остаток от 1.
8 / 3 = 2 с остатком 2.
9 / 3 = 3 с остатком 0,
Если вы хотите, чтобы ваш код был более читаемым в будущем, я лично предлагаю вам изменить свой код на что-то вроде этого:
var imgs = [ 'image1.jpg', 'image2.jpg', 'image3.jpg']; var i = 0; $(function() { // This is a shortcut for $(document).ready(); setInterval(Slider, 4000); }); function Slider() { $('#imageSlide').fadeOut("slow", function() { i = (i+1) % imgs.length; $(this).attr('src', imgs[i]).fadeIn("slow"); }); }