2012-03-25 37 views
4

Einmal sah ich ein Beispiel wie folgt aus:Ist es in Ordnung, mit() zu verwenden?

var a, x, y; 
var r = 10; 
with (Math) { 
    a = PI * r * r; 
    x = r * cos(PI); 
    y = r * sin(PI/2); 
} 

Und es sieht sehr bequem, weil auf diese Weise muss ich alle Math. s nicht geben.

Aber wenn ich einen Blick auf die MDN nehmen, heißt es:

Mit with wird nicht empfohlen und ist in ECMAScript verboten 5 Strict-Modus. Die empfohlene Alternative besteht darin, das Objekt zuzuweisen, auf dessen Eigenschaften Sie auf eine temporäre Variable zugreifen möchten.

Also ist es in Ordnung, with() zu verwenden? In HTML5?

+0

Definieren Sie "OK". Wenn du "empfohlen" meinst, dann nein (zumindest bei einer guten Quelle), und du hast die Beweise zitiert. Wenn du meinst "wird es funktionieren", dann hängt es vielleicht davon ab, ob du den strikten Modus verwendest oder nicht. – Quentin

+3

Diese Frage hat keine Nachwahl verdient – Ben

+2

BTW HTML 4 oder 5 ist irrelevant. Javascript/ECMAScript ist nicht Teil von HTML. –

Antwort

4

Die MDN Sie sagt verknüpft Using with is not recommended ...
with ist eine hervorragende Möglichkeit, von Spaghetti-Code für das Mittagessen zu machen.

Sie könnten es mögen, aber der Typ, der es debuggen muss, wird Sie verfluchen.

javascript hat einige sehr seltsame Operatoren, wie der Komma-Operator (,).
Können Sie verstehen, was der folgende Code tut?

var a = "a"; 
var b = "b"; 
a = [b][b = a,0]; 

Nun tauscht es a und b ... Sie verstehen nicht , so wie der Typ, der Ihre with Code halten müssen. Verwenden Sie keine Hacks, Hacks sind in Charades-Spielen cool, nicht in echtem Code.


When is the comma operator useful?
The comma swap Fiddle

+0

Was zum ... o.O Was soll 'a = [b] [b = a, 0];' tun? –

+0

Ich verstehe es nicht ... '[b] [b = a, 0]' wtf ... ist das? –

+1

@Derek. Prüfe die aktualisierte Geige. Es tauscht "a" und "b". Verstehst du jetzt, warum ich recht habe? Hacks sind cool, aber nicht in einem echten Code! – gdoron

3

Es ist in Ordnung, jedes Feature von JavaScript zu verwenden, , solange Sie es verstehen.

Zum Beispiel with verwenden Sie bestehenden Eigenschaften eines Objekts zugreifen können, aber Sie können neue nicht erstellen.

beachten:

with(elem.parentNode.children[elem.parentNode.children.length-3].lastChild.style) { 
    backgroundColor = "red"; 
    color = "white"; 
    fontWeight = "bold"; 
} 

Da die Eigenschaften des style Objekt bereits vorhanden sind:

var obj = {a:1,b:2}; 
with(obj) { 
    a = 3; 
    c = 5; 
} 
// obj is now {a:3,b:2}, and there is a global variable c with the value 5 

Es kann zum Verkürzen Code, wie nützlich sein.

Ich hoffe, diese Erklärung ist klar genug.

+4

"Es ist in Ordnung, jedes Feature von JavaScript zu verwenden, solange Sie es verstehen." ... und sind die einzige Person, die es jemals aufrechterhalten wird. – Quentin

+0

@Quentin. Komisch, ich habe diese Antwort nur zu meiner Antwort hinzugefügt. ** lol ** – gdoron

+0

Aber warum haben sie 'with()' nicht empfohlen? –

2

In seinem ausgezeichneten Buch "Javascript: The Good Parts", Douglas Crockford listet die "Statement" in Anhang B: Die Bad-Teile.

Er sagt "Leider sind seine Ergebnisse manchmal unvorhersehbar, so sollte es vermieden werden".

Er fährt fort, ein Beispiel zu geben, wo eine Zuweisung innerhalb der mit verschiedenen Variablen arbeiten wird, abhängig davon, ob das Objekt definiert ist oder nicht.

Siehe With statement considered harmful (aber weniger detailliert als die Erklärung im Buch).

Verwandte Themen