I hear many developers saying that the practice of creating globals is something that should be minimized, if not completely avoided all together if possible. One reason why is because of the possibility of writing over something else that is in use by setting something to the same variable name. Still with simple projects at least I find myself using them just for the sake of getting something together quickly. I often will wrap everything into a closure though when things start to get more advanced, or if it is time to create a single package for deployment rather than more readable source code.
4 - Implicit Globals
This might work as expected when it comes to the returned value, but it does result in two very different variables. One of which is coped locally within the function, and the other has become a global variable that can be accessed outside of the function. This can some times create problems if there is a situation in which there is a global variable of the same name all ready. In that case I would end up overwriting any value that that variable might have.
5.1 - Functions
It does not matter if var let or const is used inside the body of the function they will all result in a variable that is local to that function and not the global object.
5.2 - Blocks
5.3 - Monkey patching
6 - Conclusion