Есть две причины. Во-первых, как вы сказали, браузер может даже не дойти до разгрузки, поэтому вы должны объявить его над тегом body.
Другая причина заключается в том, что, как уже говорилось в GoldenNewby, необходимо дать коду некоторое время для завершения, например, предупреждение. Это связано с тем, что JavaScript очищается из памяти в тот момент, когда следующая страница готова, и выполнение старого сценария просто останавливается. Если вы можете гарантировать, что сценарий займет меньше времени, чем загрузка страницы, вам не понадобится предупреждение, но если для его выполнения может потребоваться более 2 мсек, вам потребуется некоторое время.