Una delle cose per cui il linguaggio di programmazione del coffeescript è criticato è il suo trattamento delle dichiarazioni variabili e dello scope ( esempio ).
Le risposte a questo domanda (e il blog che ho collegato sopra) sembrano incentrarsi sulla falsa dicotomia delle variabili che possono essere oscurate o essere globali. In qualsiasi linguaggio con regole di scoping ragionevoli, questa presunzione sembra (per me) essere un non-sequencer. Nel summenzionato 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
Quindi chiaramente, la barra non è globale. Se lo snippet qui sopra fosse esso stesso all'interno di un ambito non globale, allora foo non lo sarebbe nemmeno. Mi sembra che ombreggiare una variabile da un ambito esterno in una lingua con chiusura lessicale potrebbe solo creare confusione. Quindi, perché il coffeescript viene sbattuto per rimuovere la possibilità? C'è un caso d'uso importante qui mi manca? Indipendentemente da come ci si può sentire riguardo al resto del coffeescript, questo comportamento mi sembra desiderabile.