Когда вы это делаете
for (let i=0;i<btn.length;i++) {
btn[i].onclick = function() {
setTimeout(function (){
modals[i].style.display = "block";
console.log("TIMEOUT");
},1200
);
activeModal = modals[i];
}
Вы в основном говорите компилятору прикрепить обработчик событий к каждой кнопке. Кроме того, компилятор всякий раз, когда вызывается эта функция обратного вызова, убедитесь, что activeModal
обновлен.
Теперь вы создали дилемму для компилятора. Он любит содержать вещи в чистоте. При любой возможности очищает неиспользуемые ссылки. Теперь он не может этого сделать для случая activeModal
здесь, потому что вы сказали ему обновить это значение позже, когда запускается обработчик кликов. Итак, он сохраняет его, и вы можете его использовать.
Теперь, в вашей функции toggleAnimation
, currentPlayTime
не получает доступ за пределами области своей родительской функции, в отличие от activeModal
, к которому обращается обработчик событий, который выполняется в глобальной области . Итак, после выполнения функции toggleAnimation
имеет смысл очистить currentPlayTime.
. Если вы хотите избежать глобальной переменной, один из способов добиться этого - создать функцию, которая возвращает другую функцию, создавая закрытие для безопасного хранения currentPlayTime
.
function toggleAnimation() {
let currentPlayTime;
return function doDomething() {
if (path.style.transition == 'none 0s ease 0s') {
toggleIcon()
console.log("currentPlayTime on play: "+currentPlayTime);
wavesurfer.play(currentPlayTime);
compatibleTransition(wavesurfer.getDuration() - currentPlayTime );
path.style.strokeDashoffset = 0;
}
else {
toggleIcon()
path.style.strokeDashoffset = window.getComputedStyle(path).strokeDashoffset;
path.style.transition = 'none';
currentPlayTime = wavesurfer.getCurrentTime();
console.log("currentPlayTime on pause: "+currentPlayTime);
wavesurfer.pause();
}
}
}
Теперь вам нужно сделать
const variableName = toggleAnimation();
variableName();
Итак, вот что происходит, toggleAnimation
возвращает функцию, которая потребует currentPlayTime
когда он выполняется.
Это означает, что блок, содержащий возвращаемую функцию, будет необходим для ее выполнения. Следовательно, компилятор будет удерживать это закрытие, так что всякий раз, когда оно вызывается, оно могло быть выполнено.