2012-10-29 11 views
7

In un ciclo jQuery.each(), ho sempre pensato che this equivalesse a valueOfElement. Qualcuno potrebbe spiegare la differenza?jquery.each() - "this" vs valueOfElement

Esempio:

$.each(object, function(i, val){ 
    $('body').append('<b>valueOfElement:</b> ' + typeof val + ' - ' + 
    '<b>this: </b>' + typeof this + '<br/>'); 
}); 

Risultato:

valueOfElement: string - this: object 
valueOfElement: boolean - this: object 
valueOfElement: object - this: object 

Fiddle

risposta

14

La risposta è nella documentazione si è collegato a:

Il valore si può accedere anche attraverso questa parola chiave, ma Javascript avvolgerà sempre questo valore come un oggetto anche se è una stringa semplice o un valore numerico.

Tutti i valori sono incorporati negli oggetti quando si accede come this.

La vera ragione si possono trovare in questa linea di jQuery source:

callback.call(obj[ i ], i, obj[ i++ ]) === false) { 

Puoi confrontarlo con

(function(){console.log(this)}).call(1); 

che costruisce una Number, perché non si può chiamare una funzione su qualcosa quello non è un oggetto.

Da MDN on the call function:

thisArg:

noti che questo non può essere il valore effettivo visto dal metodo: se il metodo è una funzione in non-rigido codice modalità, null e undefined sarà sostituito con l'oggetto globale e i valori primitivi saranno in scatola.

Gli unici vantaggi che avrei visto nel usando this invece di valueOfElement sono:

  • semplicità: non c'è bisogno di tenere a mente l'ordine degli argomenti forniti al callback
  • capacità di utilizzare una funzione direttamente sul this anche se valueOfElement è di tipo primitivo
+0

Ok, sarebbe vantaggioso usarne uno rispetto all'altro? valueOfElement vs this, that is. – Johan

+2

Ottima spiegazione! –

+0

Cosa stai facendo ?! Smettila di migliorarlo! Va bene: D – VisioN

0

Wil this parola accesso all'elemento come oggetto JavaScript È possibile ottenere il suo valore nello stesso modo in cui si farebbe con qualsiasi altro oggetto JavaScript, oppure è possibile includerlo ($(this)) per trasformarlo in un oggetto jQuery.