2009-06-18 9 views
1

Ich habe eine verkleinerte/gepackte Javascript-Datei, die Probleme verursacht. Das Problem ist, dass die nicht gepackte Eingabedatei einige fehlende Semikola irgendwo hat, die kein Problem sind, wenn es Zeilenumbrüche gibt, aber wenn die Datei gepackt wird, werden die Zeilenumbrüche entfernt und das verursacht einen Parserfehler. Zum Beispiel:Javascript Verpackung Problem

//input 
var x = function() { 
    doSomething(); 
} // note: no semicolon 
var y = 'y'; 

//---- 
// output 
var x=function(){doSomething();}var y='y'; 
//     error here:^

Das Merkwürdige ist, dass, wenn ich ein Ersatz für die Ausgabedatei nicht alle Semikolons mit einem Semikolon und eine neue Zeile, die Datei funktioniert zu ersetzen! Dies macht es lächerlich schwierig, den Fehler zu finden, da AFAIK, ich kann mir keine Situation vorstellen, in der ein Zeilenumbruch nach einem Semikolon irgendetwas ändern sollte. Irgendwelche Ideen darüber, warum dies ersetzt wird, würden es funktionieren lassen?

Antwort

5

Uh ... Haben Sie versucht JSLint?

+4

es tat weh meine Gefühle. – nickf

+2

Verdammt, Doug Crockford! – ichiban

+0

zu erklären: Ausführen der nicht gepackten Datei über JSLint und waten durch die Fehler zu finden, fehlende Semikola gelöst das Problem. Ich bin immer noch verwirrt darüber, warum es funktionierte, wenn die Zeilenumbrüche nach Semikolons hinzugefügt wurden ... – nickf

3

Wenn es einen Zeilenumbruch gibt, gibt es ein implizites Semikolon.

+0

ja ich weiß. Die einzigen Zeilenumbrüche in der Datei folgen jetzt direkt einem Semikolon, also sollte es irgendetwas andeuten, und es funktioniert. – nickf

2

Verwenden Sie jslint, um Ihren Code zu überprüfen. Wenn Sie dies tun und es in Bezug auf Semikolons übergeben, sollte es richtig packen.

In JavaScript werden Semikolons implizit in Zeilenumbrüchen hinzugefügt. Dies führt zu Situationen, die mehrdeutig sein können. Dieser Blogbeitrag: http://robertnyman.com/2008/10/16/beware-of-javascript-semicolon-insertion/ beschreibt das Problem kurz und gibt ein Beispiel.

+0

Großartige Verbindung. Wusste überhaupt nichts darüber. –

1

JSlint ist eine gute Lösung. Auch einige Code-Editoren finden diese Art von Fehlern für Sie. Wenn ich mich richtig erinnere, fängt NetBeans diese während der Eingabe in Echtzeit ab. Ich glaube, Komodo und Aptana tun es auch.

+1

Auch IntelliJ IDEA tut dies. –