2009-05-01 3 views
63

JSLint (mit OneVar Flag eingeschaltet) ist das Markieren einige Javascript-Code, den ich mit der folgenden haben:Was ist der Grund hinter JSLint ist sagen, es „zu viele var Aussagen“

Problem at line 5 character 15: Too many var statements.

Ich bin glücklich, behebe diese Fehler, aber ich würde gerne wissen, mache ich es für die Leistung oder weil es nur eine schlechte Praxis ist und ein größeres Potenzial hat, Bugs in meinen JavaScript-Code einzuführen. Was ist der Grund für die Onevar-Flagge?

Ich habe mir die JSLint-Dokumentation für die var keyword angesehen, aber es spricht nicht speziell darüber, warum mehrere var-Anweisungen in der gleichen Funktion schlecht sind.

Hier ist ein Versuch an einem Beispiel. Erklären Sie, wie Sie den Code aus nur mit 1 var Aussage profitieren:

function Test(arg) { 
    var x = arg + 1, 
     y = cache.GetItem('xyz'); 
    if (y !== null) { 
     // This is what would cause the warning in JSLint 
     var request = ajaxPost(/* Parameters here */); 

    } 
} 
+0

Zeigen Sie uns Ihre Skripte! – alex

Antwort

99

Javascript hat keinen Blockbereich. In anderen Sprachen damit (wie c), wenn Sie eine Variable in der if-Anweisung deklarieren, können Sie nicht darauf zugreifen, außerhalb davon, aber in Javascript können Sie. Der Autor von JSLint glaubt, dass es eine schlechte Übung ist, da Sie (oder andere Leser) verwirrt werden könnten und denken, dass Sie nicht mehr auf die Variable zugreifen können, aber Sie können das tatsächlich tun. Daher sollten Sie alle Ihre Variablen am Anfang der Funktion deklarieren.

+0

Bessere Antwort als meine, Modding. – tpdi

+7

Dies beantwortet den Teil der Frage, warum man alle 'VAR's an der Spitze der Funktion deklarieren sollte, aber was ist mit dem Punkt in Bezug auf" eine 'VAR' Aussage" vs "mehrere' VAR' Aussagen (alle bei der oben)". Gibt es einen * guten * Grund dafür, oder einfach nur "es spart Tipparbeit, also warum nicht"? –

+0

Standard-JSLint-Regeln sind nur repräsentativ für die Meinung von David Crockford (http://www.jslint.com/help.html), wie man korrekten und falschen Code visuell unterscheidbar macht. Ist seine Meinung ein * guter * Grund? Weiß nicht, aber es ist zumindest ein Grund. – worc

1

Nur eine Vermutung hier, aber es kann einige Zeit für functional decomposition sein. Funktionen sollten eine Sache tun und es gut machen.

Zu viele Vars deutet auf eine Funktion, die versucht, zu viel zu tun. Oder ein Fall, in dem Sie ein Array verwenden sollten.

+0

Nicht sicher, ich stimme dem zu. In diesem Fall ist "zu viele" mehr als eine Var. Um es zu umgehen, können Sie Kommas ('var x, y;') verwenden, aber das ist schwer zu lesen. Das ist meiner Meinung nach ziemlich lächerlich und fördert schwer lesbaren Code. Ich arbeite gerade an einem Projekt mit einer Menge davon, und es ist schwer zu sehen, wo Variablen deklariert werden. –

3

Wenn die Option "onevar" auf "true" gesetzt ist, wenn nur eine var-Anweisung pro Funktion zulässig ist.

if (funct['(onevar)'] && option.onevar) { 
    warning("Too many var statements."); 
} 
+0

Okay, ich habe in der Frage geklärt, dass ich das konkret angeschaltet habe. Also weiß ich, warum es mich warnt, aber was macht das Reparieren dieser Warnungen für meinen Code? – slolife

-6

Die Idee ist, dass Sie ein Objekt anstelle von einzelnen Vars verwenden sollten. Also, wo Sie bekommen haben:

var x = arg + 1, 
    y = cache.GetItem('xyz'); 

Ändern Sie es an:

var dimensions = {}; 
dimensions.x = arg + 1; 
dimensons.y = cache.GetItem('xyz'); 
dimensions.request = ... 

können Sie dann Zugriff auf diese Variablen durch das Objekt, dessen ordentlicheres ein Objekt pro Funktion haben, dass Funktionen Variablen enthalten. Dann wirst du die Warnung nicht bekommen.

var request,x,y; 
6

einfach Ihre Vars in einem Ort wie diesem erklären.

zitieren:

In vielen Sprachen stellt ein Block einen Rahmen. Variablen, die in einem Block eingeführt wurden, sind außerhalb des Blocks nicht sichtbar.

In JavaScript führen Blöcke keinen Bereich ein. Es gibt nur Funktionsumfang. Eine Variable, die an einer beliebigen Stelle in einer Funktion eingefügt wird, ist überall in der Funktion sichtbar. JavaScript-Blöcke verwirren erfahrene Programmierer und führen zu Fehlern, weil die bekannte Syntax eine falsche Zusage macht.

JSLint erwartet Blöcke mit Funktion, wenn, wechseln, während, für, tun, und versuchen Anweisungen und sonst nirgendwo.

In Sprachen mit Blockbereich wird normalerweise empfohlen, Variablen am Ort der ersten Verwendung zu deklarieren. Aber da JavaScript keinen Blockbereich hat, ist es sinnvoller, alle Variablen einer Funktion oben in der Funktion zu deklarieren. Es wird empfohlen, pro Funktion eine einzelne var-Anweisung zu verwenden. Dies kann mit der Option vars abgelehnt werden.

29

Der offizielle Grund is here, von Douglas Crockford:

2

Die Begründung ist bereits beschrieben.

Empfehlung ist diese Form zu verwenden:

var myVar1 = document.getElementById("myDiv1"), 
    myVar2 = document.getElementById("myDiv2"); 

oder dies:

var myVar1, myVar2; 
myVar1 = document.getElementById("myDiv1"); 
myVar2 = document.getElementById("myDiv2"); 

Aber das sieht nicht sehr schön, vor allem, wenn Sie Vars dokumentieren möchten.

So können Sie nur diese Warnung deaktivieren temporarly:

/*jslint vars: true*/ 
    /** 
    * @returns {HTMLDivElement} 
    */ 
    var myVar1 = document.getElementById("myDiv1"); 
    /** 
    * @returns {HTMLDivElement} 
    */ 
    var myVar2 = document.getElementById("myDiv2"); 
    /*jslint vars: false*/ 

Warnung: stellen Sie sicher, dass dieser an der Spitze einer Funktion erfolgt.

Ich denke, das ist getan, weil jslint nicht zuverlässig feststellen konnte, ob vars an der Spitze der Funktion deklariert wurden oder nicht.

Verwandte Themen