By using the defer attribute in a script tag, the browser is able to delay parsing of the script without necessarily delaying its loading.
Typically, when a script tag is encountered, the browser halts processing of the HTML until the script is downloaded, fetched, parsed, and executed (and compiled on most browsers). This is essential for allowing JavaScript to inject HTML using document.write().
However, this can result in the user staring at a blank screen for an extended period of time.
With the defer attribute, the script is not parsed or compiled until after the HTML has finished loading. If multiple script tags have the defer attribute, they will be parsed in the order they appear in the HTML.
This information is widely available online, with resources such as the W3C pages being a good place to start (though they may be somewhat technical).