2015-05-19 14 views
46

Così ho iniziato da poco in un nuovo posto di lavoro e ho imbattuto in un formato di javascript che mi fa mettere in discussione il suo scopo. (in particolare le parentesi {})Qual è lo scopo di queste parentesi graffe superfluo?

var _occurrences = getOccurrences($('#ddlTours').val()); 
{ 
    var _occurrence = getObjectByValue(_occurrences, 'tourID', booking.tourID); 
    { 
     _occurrenceID = _occurrence.occurrenceID; 
    } 
} 

Per me sembra quasi un tentativo di costruzione di un oggetto. Ad esempio

var _occurrences : // Ignoring = getOccurrences($('#ddlTours').val()); 
{ 
    _occurrence : // Ignoring getObjectByValue(_occurrences, 'tourID', booking.tourID); 
    { 
     _occurrenceID : _occurrence.occurrenceID; 
    } 
} 

Ma come ho capito, lo eseguirà come.

var _occurrences = getOccurrences($('#ddlTours').val()); 
var _occurrence = getObjectByValue(_occurrences, 'tourID', booking.tourID); 
_occurrenceID = _occurrence.occurrenceID; 

O è così _occurrence ottiene cancellare e non si siede intorno come suo incapsulato e assegnare un var che al di fuori del incapsulamento. Funziona davvero come un miglioramento delle prestazioni? Ad esempio

Global var a = 1 
{ 
    b = someFunction() // After execution because of encapsulation it poofs??? 
    for(var c in b) 
    { 
     a += c.somefunction() 
    } 
} 

Un'altra opzione è che è solo un codice errato?

O forse è inteso come una separazione logica del codice per aiutare lo sviluppo?

Mi chiedevo se qualcuno potesse far luce su questo per me :)

+3

immagino, qualcuno ama solo le parentesi graffe. :) – CuriousMind

+14

Le parentesi formano un [_block statement_] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/block). A differenza di altri linguaggi, un blocco in JavaScript non crea un nuovo ambito (per dichiarazioni variabili, ad esempio). Quindi l'uso qui sembra fuori di me. –

+0

Non hoha, voglio rimuoverli ma non voglio rompere le cose rimuovendole. @CuriousMind – Spaceman

risposta

45

Hai ragione a mettere in discussione quelle parentesi graffe. Non fanno niente. Il codice all'interno delle parentesi viene eseguito esattamente come se le parentesi non fossero presenti. È chiaramente un errore averli lì così.

Come hai detto, sembra che qualcuno possa aver pensato che le parentesi graffe avrebbero introdotto un ambito di blocco, forse facendo sì che una variabile uscisse dall'ambito dopo la chiusura delle parentesi. Ma JavaScript non ha scope di blocco per le variabili var! (Ha un ambito di blocco per let, ma solo nei più recenti motori JavaScript che supportano let.)

O forse hanno solo pensato che sarebbe un buon modo per documentare dove vengono utilizzate le variabili. Non è.

Aggiungendo all'umorismo qui, il codice sembra mancare il var per _occurrenceID interamente - quindi probabilmente sta creando una variabile globale involontariamente!

Il modo in cui hai riscritto il codice senza le parentesi graffe è in effetti come verrà effettivamente eseguito. È una rappresentazione migliore di ciò che effettivamente fa il codice ed è come dovrebbe essere scritto il codice. (Risolto il mancante var ovviamente ...)

+0

"manca il' var' ... "- che potrebbe essere intenzionale, se cercassero di documentare dove sono state usate le variabili. Nidificando con questo intento, sembra che tu possa solo andare parallelo o più profondo, a meno che tu non diventi globale. – Izkata

8

Per quanto posso dire le parentesi sono solo un suggerimento per lo sviluppatore che sta leggendo il codice.

La mia ipotesi sono le parentesi graffe e la nidificazione serve solo per illustrare che l'elenco contiene un elemento che contiene un ID. Questo potrebbe essere inteso per aiutare il lettore a capire che se modificano uno qualsiasi di quel codice, o lo spostano, quindi modifica anche il codice interno per farlo corrispondere.

3

Queste parentesi sono solo per rendere il codice più leggibile che è quello che pensano alcuni programmatori. Le parentesi non hanno nulla a che fare con nessun tipo di altra funzionalità. Le persone fanno il codice cablato. Saluti per una nuova esperienza. :-P

+5

Dovrebbe essere "Le persone fanno codice strano", o stai insinuando che il codificatore originale era alto sugli stimolanti? :) –

+2

LOL Sto solo condividendo la mia esperienza ;-P –

10

O forse è inteso come una separazione logica del codice per aiutare lo sviluppo?

ho intenzione di fare 2 ipotesi qui:

  1. lo sviluppatore non era incompetente
  2. hai lasciato fuori un sacco di linee tra le graffe

(se 1 è non vero quindi tutte le scommesse sono disattivate)

I blocchi di parentesi graffa del do-nothing hanno uno scopo - in vari editor di testo segnano il secti che può essere collassato e quindi rimosso dalla vista. Lo faccio spesso se ho più di 50 linee che so funzionare ma devo scorrere costantemente oltre. Metti i ricci intorno al contenuto (fai attenzione al nidificazione), clicca l'icona "comprimi/piega" nella grondaia -> il codice scompare. Il mio editor particolare ricorderà i blocchi piegati, quindi non ho bisogno di ripiegare ogni volta.

+1

Il codice è come se nulla fosse stato omesso. Ci deve essere un modo per ottenere la piegatura senza usare il codice che aumenterà le dimensioni del file quando in bundle cioè nei commenti. – Spaceman

1

Vedere il codice con visualizzazione del compilatore.

parentesi graffe sono solo di definire il campo. Non altro.

Considerare, ecco un esempio.

for(var c in b) 
{ 
    a += c.somefunction(); 
} 

Questo codice è simile a

for(var c in b) 
    a += c.somefunction(); 

vale a dire per impostazione predefinita per ciclo ha portata fino alla prossima dichiarazione.

Analogamente,

var _occurrences = getOccurrences($('#ddlTours').val()); 
{ 
    var _occurrence = getObjectByValue(_occurrences, 'tourID', booking.tourID); 
    { 
     _occurrenceID = _occurrence.occurrenceID; 
    } 
} 

questo è solo a definire l'ambito e aggiungendo istruzioni all'interno di tale ambito. Sebbene tu dichiari la variabile in tale ambito, il concetto di sollevamento farà apparire tutte le variabili in alto.

La dichiarazione della variabile all'interno di un ambito è proprio come;

if(true){ 
var _occurrence = getObjectByValue(_occurrences, 'tourID', booking.tourID); 
} 

.

In parole semplici,

var _occurrences = getOccurrences($('#ddlTours').val()); 
{ 
    var _occurrence = getObjectByValue(_occurrences, 'tourID', booking.tourID); 
    { 
     _occurrenceID = _occurrence.occurrenceID; 
    } 
} 

è pari a:

var _occurrences = getOccurrences($('#ddlTours').val()); 
if(true){ 
    var _occurrence = getObjectByValue(_occurrences, 'tourID', booking.tourID); 
    if(true){ 
     _occurrenceID = _occurrence.occurrenceID; 
    } 
} 
+1

http://www.w3schools.com/js/js_hoisting.asp Ho avuto una rapida lettura del concetto di sollevamento. È una caratteristica interessante che non sapevo esistesse. Ancora non capisco come sia utile in questo caso. – Spaceman