For the record, CoffeeScript tries to help ameliorate <i>all</i> of these "warts".<p>* "Hoisting under the hood" -- Function declarations vs. function expressions don't get you into hoisting trouble, because there are no function declarations, and every value is an expression.<p>* Explicit block scopes can be (more easily) created with:<p><pre><code> do (x, y) ->
# here, x and y are captured in a new scope.
</code></pre>
* "What does 'this' mean?" -- The value of "this" can be fixed lexically, by using the bound function (fat arrow) =>, instead of the normal function arrow: ->. Look ma, no "var that" or "var self":<p><pre><code> $.getJSON url, (resp) =>
this.setResponse resp
</code></pre>
* "Fixing Arguments" -- Function arguments are always available as an array instead of an Arguments object.<p><pre><code> myVariadicFunction = (args...) ->
# here, "args" is an Array.
</code></pre>
* "Avoiding truthiness" -- There is no "==" and "!=" in CoffeeScript, all equality is strict equality. For the one case where double equals <i>is</i> useful in JS, you have the existential operator...<p><pre><code> if a is b
# here, a === b.</code></pre>