The var hoisting problem? let resolves that. IIFEs ? The function context syntax eliminates the need for that.
There’s lots more though and hopefully the upcoming series of posts will provide in-depth walkthroughs of de-structuring, iterators and generators, new data structures (Map + WeakMap, Set + WeakSet), Proxies, Promises, rest parameters, new standard library functions and much more.
But first, the history lesson.
How did we get here?
ES2 (June 1998) – Contained only minor standardization changes.
ES3 (December 1999) – Introduced try/catch , Errors and improved string handling. Saw strong adoption across all browsers before being overtaken by ES5. Do you know you could overwrite undefined with some other value in this JS version? Don’t do evil stuff like that…
Two parties emerged – one party wanted the ES4 upgrade while the opposing party believed it would ‘break’ the Internet. Since they couldn’t agree, the opposing party designed a minor language upgrade tagged ES3.1 (readSemVer for more on version numbers).
Ultimately the two parties met again in Oslo and agreed to release ES3.1 as ES5, shelve ES4 and collaborate on a ‘harmonizing’ version. And that’s how ES6 got the Harmony name.
Some of the features that got released in this version include ‘ strict mode ‘, native JSON support, non-writable NaN, undefined, Infinity values and some standard lib improvements e.g. forEach , map, keys etc.
ES5.1 (June 2011) contained a few minor corrections.
ES6 became feature complete in 2015 – hence the ES2015 name since the plan is to have yearly releases going forward. Yes, work has started already on the ES2016/ES7 version and you can contribute if you want.
There is improving support across hosting environments (both browsers and node); you can check kangax’s table and the Microsoft platform reference . If you can’t wait to try the new awesomeness, why not try out Babel , Traceur or even TypeScript . Full-band coverage of features by all browsers would likely take time, for example ES5 was released in 2009 and there are still browsers that don’t offer full feature support.
The absence of lexical scoping, funny behaviour of dictionaries and loss of context have puzzled many programmers and led to many bugs. Yes, a couple of workarounds exist for all these but the principle of least surprises is a powerful one.
The class syntax should help hide prototypical inheritance by providing familiar syntax; let provides lexical scoping, arrow functions remove the need for that=this and Maps allow objects as keys.
Easier for all
The standard library has been enhanced – there is native promise support, improved string handling methods (templates are finally here!) and other methods too.