2009-03-20 7 views
43

Ho visto alcune persone usando l'operatore void nel loro codice. Ho visto anche questo href attributi: javascript:void(0) che non sembra niente di meglio di javascript:;Qual è il punto dell'operatore void in JavaScript?

Quindi, qual è la giustificazione di utilizzare l'operatore void?

+3

vuoto è un operatore che non restituisce nulla dopo aver valutato una determinata espressione, non è necessario utilizzare "(" e ")" per farlo funzionare. – Cleiton

+0

sizeof è lo stesso in C, ma quel codice è molto più chiaro se vengono utilizzate le parentesi. – olliej

+0

'void' è usato raramente. In ES5 è considerato obsoleto. Dopo la valutazione del suo operando restituisce 'undefined' – jjpcondor

risposta

46

Explanation of its use in links:

<snip>

Questa è la ragione per cui bookmarklets spesso racchiudere il codice all'interno void() o una funzione anonima che non si ritorno nulla per fermare il browser da cercando di visualizzare il risultato di eseguendo il bookmarklet. Per esempio:

javascript:void(window.open("dom_spy.html")) 

Se si utilizza direttamente il codice che restituisce qualcosa (una nuova istanza finestra nel questo caso), il browser finirà visualizzazione che:

javascript:window.open("dom_spy.html"); 

In Firefox la al di sopra del display volontà:

[object Window] 

</snip>

+0

Vedere anche [void operator MDN docs] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/void). –

10

Si consideri il seguente:

<a href="javascript:void(fish=document.getElementById('foo').value);void(document.getElementById('bar').value=fish);">With Void</a> 

<a href="javascript:fish=document.getElementById('foo').value;document.getElementById('bar').value=fish;">Without Void</a> 

<input type="text" id="foo" value="one fish" /> 
<input type="text" id="bar" value="no fish" /> 

Il primo collegamento sarà scambiare i valori dei campi di testo. Il secondo link aprirà una nuova pagina con il testo "un pesce". Se si utilizza uno javascript: link, nel momento in cui un'espressione restituisce qualcosa di diverso da null o undefined, il browser interpreterà ciò come il collegamento dovrebbe fare. Con il wrapping di tutte le espressioni/statistiche in una funzione void(), si garantisce che l'intero snippet di codice verrà eseguito. Al giorno d'oggi, questo è principalmente utilizzato in Bookmarklet, poiché l'utilizzo di un attributo onclick o l'impostazione di gestori di eventi in blocchi/file JavaScript separati è la "norma".

Per quanto riguarda javascript: rispetto a javascript:void(), la prima affermazione è ambigua. Stai dicendo "hey, voglio eseguire qualche javascript", ma non fornisci alcun codice. Non è necessariamente chiaro cosa dovrebbe fare il browser qui. Con la seconda affermazione stai dicendo "ehi, esegui qualche javascript", e il tuo codice alla fine ritorna indefinito, che il browser sa che significa "non fare nulla".

Dato che sono qui, farò anche notare che usare javascript: o javascript:void(); è caduto in disgrazia con la maggior parte delle persone che si preoccupano del markup. La cosa migliore da fare è che il gestore onclick restituisca false e che il link sia indirizzato verso una pagina/risorsa che abbia senso per le persone con javascript disattivato o che utilizzano un blocco JavaScript come NoScript.

+0

L'autore della domanda ha scritto "javascript :;", non "javascript:". Quindi, non sarebbe ambiguo in quel caso, vero? –

+0

Qualche istruzione vuota restituisce false o restituisce true, indicando che l'istruzione è stata eseguita correttamente? –

+1

Perché una dichiarazione vuota restituisce qualcosa? –

4

Il valore undefined non è stato direttamente accessibile in JavaScript fino a ES1.3.

È stato pertanto incluso un operatore void <expression> per consentire l'accesso a questo valore.

Talvolta è utile, in particolare quando si lavora con l'API Web (ad esempio gestori di eventi), per garantire che il risultato di un'espressione sia sempre uguale a undefined.

Quando la proprietà undefined è stata aggiunta all'oggetto globale in ES1.3 l'utilità di void è diventata non ovvia.

Quindi la tua domanda.

+0

Downvoter, per favore spieghi? – Ben