Комментарий W3schools неполный. В большинстве случаев переменные очищаются после завершения функции (не обязательно мгновенно, но при следующем запуске сборки мусора). Но это только потому, что в большинстве случаев больше нет ссылок на эти переменные.
Однако, поскольку javascript поддерживает функции как объекты первого класса, он также поддерживает замыкания. Когда у вас есть такая строка:
$(document).on('mousedown', function(){console.log('down: ', x++);});
... вы создаете замыкание. Это замыкание является новой функцией плюс лексическая среда, в которой она была определена. У него есть ссылка на x
, и поэтому, даже когда a
завершит свое разрешение, x
не будет собирать мусор. Позже, когда функция вызывается, она все равно может получить доступ к переменным замыкания.
x
потенциально может по-прежнему быть сборщиком мусора, но только если все затворы, ссылающиеся на него, также собирают мусор. В этом случае вы добьетесь этого, отменив регистрацию событий mouseup и mousedown и отменив интервал.