Even worse it has bits of functionality that are now layered on top of each other - so hoisting still happens unless you use const and let, there is strict mode which exists if you put the use strict declaration or have things in a module, but otherwise you might make a mistake somewhere and have things polluting the global scope that either you thought was impossible or even worse you were not aware that was even a possibility with the language because you were raised in a garden where it was not allowed, only now a bug brought a bit of the wilderness in to you and you don't understand what the heck is going on.
So to escape these problems with the language use linters, but some times people turn off linters etc. etc.
The suggestion to deal with problems of the language seem always to be:
1. Add more syntax, meaning more special cases to remember how things behave with that syntax!
2. Be disciplined and good and you will never experience these problems that the language has. Also all of your team needs to be disciplined and good, and the people who used to be on the team before you joined should be disciplined and good, and thus there should not be any code that is old enough to be written in a way that does not fit our modern definitions of disciplined and good.