Muranx, ну во первых, let появился не в не ЕС5 (что вообще тут C?), а ES6 (ECMA Script 6th edition).
setTimeout работает асинхронно, и независимо, let там или var, он выполнит свою функцию после цикла. Но так как в JS работают замыкания, эта функция "видит" переменную из окружения. Разница в том, какие это переменные. При var переменная одна, и все 3 функции (да, если мы пишем функциональное выражение внутри цикла, то на каждой итерации еще и по новой функции создается, что, кстати говоря, весьма дорого как по памяти, так и по производительности), при let объявленном внутри цикла переменная будет новая на каждую итерацию, и каждая функция будет держать в замыкании свою переменную.
Чисто es5 вариантов предлагают много, вот некоторые из них:
2 варианта, с оборачиванием в IIFE:
Правда тут уже будет создано 6 функций в памяти на 3 итерации, хотя и IIFE быстро подберется сборкой мусора
Вариант с bind:
for(var k = 0; k < 3; k++) {
setTimeout(function(k){
console.log(k); // 1, 2, 3
}.bind(void 0, k), 500);
}
На деле функций в памяти так же будет 6, да еще и работает медленнее предыдущих, ибо много всяких if под капотом
Как по мне, самый правильный вариант - это вспомнить, что setTimeout умеет передавать аргументы в вызываемую функцию, а заодно и вынести функцию за цикл, ибо на деле нам достаточно 1 функции:
function onTimeout(k) {
console.log(k); // 1, 2, 3
}
for(var k = 0; k < 3; k++) {
setTimeout(onTimeout, 500, k);
}
Vann Damm, нужно либо закомитить (git commit) локальные изменения и потом сделать git pull
либо спрятать их (git stash) и потом опять таки git pull, а после можно восстановить спрятанные изменения через git stash pop (при этом автоматически произойдет merge и могут появится конфликты, которые придется разруливать руками)
Игорь Махов, у каждой расшаренной папки в smb.conf можно назначить своего пользователя и группу, папку будет обслуживать дочерний процесс запущенный из под этого юзера и группы
Задается это так:
[share_name]
force user = USER_NAME
force group = GROUP_NAME
kitcarver, если в договоре не прописано, то уже можно ставить акцент на том, что изначально не обсуждали, и дальше 3 варианта в зависимости от Вашего желания и Ваших умений:
1. сделать можно, но за доп оплату
2. сделать можно, делов на час, заказчик еще раз придет наверняка, уж прощу ему эти пару тысяч
3. не умею (не хочу) это делать, и заказчик идет искать другого исполнителя
zlodiak, это не анархия, это обычный код, привычный любому функциональщику. В ЯП наподобие Haskell, OCaml или Rust - все есть выражение, а последнее выражение функции - это результат этой функции.
Подобный стиль написания кода гарантирует, что в коде не будет if, for и прочих императивных штук, которые сильно снижают поддерживаемость, а также не нужно явно писать return
Ну и еще, автор данного фрагмента кода мутирует пришедший аргумент, что делает данную функцию грязной, а следовательно плохо поддерживаемой, плохо переиспользуемой и плохо тестируемой.
P.S. если бы вы заглянули в мой обычный код, то скорее всего бы удивились, что большая часть функций вообще не имеет явного тела, вместо этого оно вычислено с помощью композиции
Надим Закиров, десктопные браузеры еще ведут статистику, на каких сайтах люди запускают видео, притом такая статистика есть общая и персональная. Если Вы постоянно будете на некотором сайте запускать видео, то персонально у Вас этот сайт получит разрешение на автозапуск. А такие сайты как ютуб, инстаграм или твич имеют такие разрешения по общей статистике.
Ну и на телефонах вроде как все проще, нельзя и все.
ну и еще из хитростей:
при muted === true - браузер считает что звук выключен, и не запрещает автоплей, но и не активирует хак выше
но при volume === 0 - звук включен, хоть и убавлен до полностью не слышимого
Надим Закиров, чисто без теории, действия требующие user interaction можно запустить только после click или keypress
а вот поймать эти события можно реально хоть на body
притом медиа элементы запоминают, что их запускали со звуком, так что вполне проканаетaudio.play().then(() => audio.pause()) для активации
setTimeout работает асинхронно, и независимо, let там или var, он выполнит свою функцию после цикла. Но так как в JS работают замыкания, эта функция "видит" переменную из окружения. Разница в том, какие это переменные. При var переменная одна, и все 3 функции (да, если мы пишем функциональное выражение внутри цикла, то на каждой итерации еще и по новой функции создается, что, кстати говоря, весьма дорого как по памяти, так и по производительности), при let объявленном внутри цикла переменная будет новая на каждую итерацию, и каждая функция будет держать в замыкании свою переменную.
Чисто es5 вариантов предлагают много, вот некоторые из них:
2 варианта, с оборачиванием в IIFE: Правда тут уже будет создано 6 функций в памяти на 3 итерации, хотя и IIFE быстро подберется сборкой мусора
Вариант с bind: На деле функций в памяти так же будет 6, да еще и работает медленнее предыдущих, ибо много всяких if под капотом
Как по мне, самый правильный вариант - это вспомнить, что setTimeout умеет передавать аргументы в вызываемую функцию, а заодно и вынести функцию за цикл, ибо на деле нам достаточно 1 функции: