Первый пример представляет собой Немедленно-Вызванный Функция Выражение (IIFE). Это функция, которая сразу же выполняет свою работу после создания. IIFE - общий шаблон проектирования JavaScript, используемый большинством популярных библиотек (jQuery, Backbone.js, Modernizr и т. Д.), Чтобы поместить весь код библиотеки внутри локальной области.
В ES6 это можно переписать с помощью Arrow function если вы хотите .blinkMe
мигать только один раз:
(() => $('.blinkMe').fadeOut(500).fadeIn(500))();
Вы можете цепи столько fadeIn
и fadeOut
функции, как вы хотите, конечно. Если вы хотите, чтобы он вращается бесконечно, я бы предложил путь IIFE.
Дополнительная информация о IIFE here.
О вашем втором примере. Вы вызываете функцию внутри своей собственной функции (также называемой рекурсивной петлей). В вашем случае это создает бесконечный цикл, поэтому он не работает. Удалите blink();
внутри функции, и он будет работать:
function blink() {
$('.blinkMe').fadeOut(500).fadeIn(500, blink);
}
blink();
Кроме того, с JavaScript вы можете решить эту проблему с CCS3 анимации. Анимации CSS3 выполняются в отдельном потоке. Это решение без JQuery:
(function blink() {
document.getElementsByClassName('blinkMe')[0].className += ' blinkActive';
})();
// Arrow function:
//(() => document.getElementsByClassName('blinkMe')[0].className += ' blinkActive')();
.blinkMe {
width: 80px;
height: 80px;
background: deepskyblue;
}
.blinkActive {
-webkit-animation: blink 1s infinite;
animation: blink 1s infinite;
}
@-webkit-keyframes blink {
0%, 100% { opacity: 1; }
50% { opacity: 0; }
}
@keyframes blink {
0%, 100% { opacity: 1; }
50% { opacity: 0; }
}
<div class="blinkMe"></div>
Я не знаю, сколько элементов вы хотите мигать на вашей странице, если это только один элемент, который вы можете использовать идентификаторы вместо классов. Имейте в виду, что правило @keyframes
не поддерживается в IE9 или более ранних версиях и Opera Mini: Link.
Второй бросает StackOverflow исключение. Он не должен называть себя. – Bergi