2010-03-29 2 views
19

Ho visto il codice JavaScript che inizia con with. Questo è un po 'confuso. Che cosa fa e come può essere usato correttamente?Cosa fa "with" in JavaScript?

with (sObj) return options[selectedIndex].value; 

risposta

22

Si aggiunge la portata delle affermazioni contenute nel blocco:

return sObj.options[selectedIndex].value; 

può diventare:

with (sObj) 
    return options[selectedIndex].value; 

Nel tuo caso, si doens't fare molto. ..ma considera quanto segue:

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

diventa:

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

... salva un paio di sequenze di tasti. La documentazione di Mozilla in realtà fa un buon lavoro di spiegare le cose in un po 'più in dettaglio (insieme con i pro ei contro di utilizzare it):

with - Mozilla Developer Center

+0

utilizzo Lame, proprio come in VBA. In Python puoi occuparti di ripulire un oggetto usa e getta. In C# si chiama usando. –

+0

1 - Hey Justin - Nizza spiegazione –

+0

@ Marco - Grazie. Sembra che avrei dovuto includere la clausola "suggerisci di non usare questo". –

1

Raccomando di non utilizzare questo a causa di problemi di prestazioni, ma cosa i mezzi sopra indicati sono:

per l'oggetto sObj (qui presumibilmente un elemento di selezione), tutti i figli e le proprietà a cui si fa riferimento su questo (o tra le seguenti parentesi graffe) trattano questo come ambito genitore.

1

Non è una funzione (come è stato indicato nel titolo della domanda prima della modifica) ma una dichiarazione. Si potrebbe avere più senso se il codice di esempio è formattato in questo modo:

with (sObj){ 
    return options[selectedIndex].value; 
} 

Per quanto riguarda ciò che fa (Source)

L'istruzione with stabilisce l'oggetto predefinito per un insieme di istruzioni. JavaScript cerca qualsiasi nome non qualificato all'interno dell'insieme di istruzioni per determinare se i nomi sono proprietà dell'oggetto predefinito. Se un nome non qualificato corrisponde a una proprietà, la proprietà viene utilizzata nell'istruzione; in caso contrario, viene utilizzata una variabile locale o globale.

Il che significa che nel codice di esempio, viene prima controllato se options è una struttura di sObj. Se è allora options si riferisce alla sObj.options, altrimenti controlla altri scopi per una variabile definita con il nome options

Lo svantaggio di usare una dichiarazione with è che è impossibile sapere da un semplice sguardo al codice di ciò che viene letta.Ci sono altre alternative migliori, come mostrato nella this article

+0

Mentre il resto della risposta è corretta, la formattazione ha relativamente poco da fare con esso. – belugabob

+0

@belugabob Si prega di leggere * * la risposta, piuttosto che indovinare quanto al suo contenuto. Non ho mai menzionato la formattazione che ha alcuna rilevanza per l'affermazione 'with'. Ho detto che ha più * senso * se è formattato usando le parentesi graffe in quanto lo fa apparire meno come una chiamata di funzione e più come una dichiarazione. – Yacoby

+0

@belugabob Ho anche riordinato l'ordine delle parole per rendere più difficile fraintendere. – Yacoby

2

In che con il blocco non dovete digitare:

sObj.options[selectedIndex].value 

, ma si può semplicemente utilizzare:

options[selectedIndex].value 
2

sua l'equivalente di

return sObj.options[selectedIndex].value; 

With consente di emettere un blocco di istruzioni del conte xt di un oggetto particolare. Pertanto tutte le istruzioni nel blocco with sono presi per essere membri dell'oggetto in parentesi.

questo può rendere il codice più leggibile, a volte, ma può anche portare ad ambiguità, dal momento che i riferimenti variabili possono essere sia con SOBJ o globale.

legitimate uses for javascript's "with" statement: D

9

la dichiarazione with è puro zucchero sintattico, ma può anche causare alcuni bug fastidiosi.

Vedere with Statement Considered Harmful di chiarimenti:

Se non è possibile leggere un programma ed essere sicuri che si sa che cosa si sta per fare, non si può avere fiducia nel fatto che si sta andando a lavorare correttamente. Per questo motivo, la dichiarazione with dovrebbe essere evitato.

+2

++ per menzionare gli svantaggi di "con" –

1

tuo esempio potrebbe essere riscritta come ...

return sObj.options[selectedIndex].value; 

... come il 'con' posti dichiarazione tutti i prospetti correlati nel campo di applicazione dell'oggetto fornito. In questo caso, è abbastanza inutile, ma, se si stesse facendo un sacco di operazioni su 'SOBJ', quindi si risparmia un sacco di battitura.

esempio totalmente fittizio ..

with (sObj) 
{ 
    if(options[selectedIndex].value < 10){ 
     options[selectedIndex].value++; 
     total+ = options[selectedIndex].value; 
    } 
} 

Ma, detto questo, è spesso il caso che digitando il risparmio può essere ottenuto in modi migliori.