Ich arbeite mit coffeescript (Version 1.11.1) und stieß auf etwas, das ich nicht beschreiben kann. Ich habe einfach nur versucht, ein Array von Objekten von einem Feld zu sortieren, die ich wie so tun können:Coffeescript array.sort (a, b) generiert fehlerhaftes JS
data.sort (a,b) ->
if a.name < b.name then -1 else if a.name > b.name then 1 else 0
Dies erzeugt das folgende Javascript:
data.sort(function(a, b) {
if (a.name < b.name) {
return -1;
} else if (a.name > b.name) {
return 1;
} else {
return 0;
}
});
ehrfürchtig. Aber in meinem ersten Versuch habe ich diese statt:
data.sort(a,b) ->
if a.name < b.name then -1 else if a.name > b.name then 1 else 0
Und das erzeugte Javascript ist für das heißt:
data.sort(a, b)(function() {
if (a.name < b.name) {
return -1;
} else if (a.name > b.name) {
return 1;
} else {
return 0;
}
});
Welche, weil Javascript so nützlich ist, nicht stumm (zumindest in Chrome) und bewirkt, dass die Umgebungsfunktion vorzeitig zurückkehrt. Ein wenig frustrierend, aber ich werde darüber hinwegkommen.
Zuerst möchte ich bestätigen, dass das Verhalten erwartet wird. Ich denke es ist wahrscheinlich und ich habe ein paar vage Gedanken um meinen Schädel herum, warum das so ist, aber ich hoffte, ein festeres Verständnis zu bekommen. Wie soll dies beschrieben werden oder welche Terminologie ist für dieses Merkmal der Sprache relevant?
Ich würde das Niveau der Weißraumempfindlichkeit beunruhigend finden, wenn es kein Fehler ist * (und wenn ich CoffeeScript verwendete) *. –
@squint Je mehr ich darüber nachdenke, der Grund, warum ich denke, dass dies geschieht, ist, dass eine Funktion eine Funktion in js zurückgeben kann, also muss es eine Möglichkeit geben, die beiden zu unterscheiden.Coffeescript hat syntaktisch sinnvolle Leerzeichen wie (ala Python) also kommt das mit dem Deal. Wirklich ist es die JS-Maschine, die hier das Problem ist. Warum es nicht abmeldet, dass a/b nicht definiert ist, ist für mich unergründlich. – JimmyJames
Die JS-Engine ist nicht das Problem. JS-Engines werden Ihnen sagen, dass 'a' oder' b' nicht deklariert sind, wenn sie es nicht sind. Wenn kein * ReferenceError * vorhanden ist, werden diese Bezeichner deklariert. Ich bin kein Python-Entwickler, aber ich weiß, dass es für die Einrückung empfindlich ist. Ich habe nicht bemerkt, dass die Empfindlichkeit des Weißraums sich auf das Niveau ausgeweitet hat, das Sie hier zeigen. –