Difficult understanding
A variable makes more sense when declared and used next to the code that manipulates it. Often in a global context it is difficult to understand (completely) the role of that variable.
Coupling
When different parts of your code access this same global variable you end up coupling much of your code, it is difficult to modularize it (reuse only that "piece" of your code).
Rules on access and competition
With everyone accessing the variable it is difficult to force constraints on it and, mainly, coordinate multiple-threaded access.
Conflicts of namespace
The name of the global variables will affect your entire namespace. This ends up polluting the code as you will often be required to use another name or specify the full name (with the namespace), which normally you would not do.
With the word, Crockford
Follow an excerpt from the book that you quoted:
Because a global variable can be changed by any part of the program at any time, they can significantly complicate the behavior of the program. Use of global variables degrades the Reliability of the Programs that use them.
Global variables make it Harder to run Independent subprograms in the same program. If the subprograms happen to have global variables that share the same Names, then they will interfere with each other and likely fail, usually in Difficult to diagnose Ways.
Lots of Languages have global variables. For example, Java’s public Static Members are global variables. The problem with Javascript isn’t just that it Allows them, it requires them. Javascript does not have a Linker. All Compilation Units are Loaded into a common global Object.
Just a curiosity: are evil is some expression used in Brazil with a negative connotation?
– Zuul
@Zuul Yes, it would be like "globals are evil"
– bfavaretto
There is additional information on the subject in the tag [tag:variables-global]
– Maniero