function superCallback() {
console.log("Свершилось! Коллбэк сработал.");
}
document.addEventListener("keydown", superCallback);
// на этот момент мы объявили функцию и повесили слушатель события
// дальше всё, делать больше нечего, движок JS свободен
// но слушатель сидит, ждёт.
Наступает const repack = arr => {
const result = [...new Array(1 + Math.floor((arr.length - 1) / 2.5))].map(() => []);
arr.forEach((el, i) => result[Math.floor(i / 2.5)].push(el));
return result;
}
JSON.stringify(repack([1, 2, 3, 4, 5, 6, 7, 8, 9]))
// "[[1,2,3],[4,5],[6,7,8],[9]]"
[...new Array(length)].fill(value) // тут не годится, т.к. заполняем пустыми массивами
// и чтобы это не был один и тот же массив («передача по ссылке»)
// заполняем другим способом, через map()
[...new Array(length)].map(() => [])
3, 2, 3, 2, ...
через Math.floor(i / 2.5)
data:image/jpeg;base64,
<img src="data:image/jpeg;base64,/9j/4AAQ..." />
then()
— как приклеить стикер на циферблат, где написано, что надо будет сделать, когда время придёт. then()
ничего не попадает «сразу». Вернее, в него сразу передают 2 функции: одну вызовут, когда промис выполнится; вторую – если обломается: .then(onResolve, onError)
await
прячет под капот движка JS лишние провода, и наверху просто возвращает результат выполненной асинхроты. Или кидает Exception в случае облома — его надо ловить обычными try..catch
const requestPromise = new Promise(function(res, rej) {
setTimeout( function(result){ // имитация асинхр запроса куда-то
// тут, типа, наконец получили ответ
if (result.error_code) {
rej(error_code); // облом
} else {
res(result); // обещание выполнено с результатом
}
}, 2000);
});
// здесь requestPromise – это Promise в статусе "pending"
requestPromise.then( // сюда ничего не попадает «сразу». Оно внутри ждёт. Терпеливо.
function(result) {console.log(result, "мы молодцы");},
function(error) {console.error(error, "облом вышел");},
);
При желании можно навесить ещё requestPromise.then(r => console.log("result log:", r));
collision(enemy[i].x,enemy[i].y,player[j].x,player[j].y,32,32,32,32,player.splice(j,1),enemy.splice(i,1));
В функцию передаётся не действие, которое надо выполнить в случае — а его результат. Вот этиplayer.splice(j,1)
enemy.splice(i,1)
выполняются сразу, при первом же обращении — и не останется ни игроков ни врагов. Ядерная зима.collision()
, чтобы там её вызвали только после проверки условий.x, y, w, h
. Так можно передавать сами объекты целиком:function collision(A, B, onCollision) {
if (
A.x + A.w >= B.x
&& A.x <= B.x + B.w
&& A.y + A.h >= B.y
&& A.y <= B.y + B.h
) {
onCollision(); // <-- только тут выполнятся действия
}
}
// ...
player.push({x: 0, y: 0, w: 32, h: 32});
enemy.push({x: 144, y: 104, w: 32, h: 32});
// ...
collision(
enemy[i],
player[j],
function() {
player.splice(j,1);
enemy.splice(i,1);
}
);
// заменить это:
$('#api-cat #song'+id+', #api-wb #song'+id+'').index()
// на это:
($('#api-cat #song'+id+', #api-wb #song'+id+'').index() + 1)
$('h1 em').html([
'Играет',
$('#api-cat #song'+id+', #api-wb #song'+id+'').index() + 1,
'трек из',
$('h1').attr('data'),
'<i class="fa fa-cube"><i>',
].join(' '));
<script>
{
const texts = [
"Фраза 1.",
"Фраза 2.",
];
const selected = texts[Math.floor(Math.random() * texts.length)];
const div = document.createElement('div');
div.innerText = selected;
document.body.appendChild(div);
}
</script>
while( )
выражение приводится к одному из двух: true
или false
. Цикл крутится, пока в скобках всё ещё получается true
.var i = 5;
i != 0 // true, вальсируем дальше
5 // любое ненулевое число становится true
"yes" // непустая строка тоже true
{a: "A", b: "B"} // объекты всегда true
0 // false
"" // пустая строка, false
undefined // false
null // false
NaN // false
0
даёт false
, остальные числа true
.&&
, ||
, !
их можно использовать не только для проверки двойных условий, но и, например, задавать значение на случай нуля:var a = 0;
var b = a || 42; // если a пустое. то в b попадёт запасное значение 42.
true
или false
, как внутри скобок while()
: дописать перед ним два восклицательных знака!!expression
Тут дважды применяется !
– логическое НЕ, которое уже при первом применении сделает из выражения true
или false
, только зеркально наоборот, и нужен ещё один перевёртыш, чтобы получить задуманное значение.true
, а при создании таких же событий скриптом — false
.