One of the things the coffeescript programming language is criticized for is its treatment of variable declarations and scope (example).
The answers to this question (and the blog I linked to above) seem to hinge on the false dichotomy of variables either being able to be shadowed or else be global. In any language with reasonable scoping rules, this conceit seems (to me) to be a non-sequiter. In the aforementioned coffeescript:
foo = 5 f = () -> foo = 12 #foo in the outer scope is closed-over bar = 3 #binds a name in f's scope null f() foo #12 bar #undefined because it was bound in an inner scope
So clearly, bar is not global. If the snippet above was itself inside a non-global scope then foo would not be either. It seems to me that shadowing a variable from an outer scope in a language with lexical closure could only possibly create confusion. So why does coffeescript get slammed for removing the possibility? Is there an important use case here I'm missing? Regardless of how one may feel about the rest of coffeescript, this behavior seems desirable to me.