2012-10-29 15 views
7

W pętli jQuery.each() zawsze uważałem, że this było równoważne valueOfElement. Czy ktoś mógłby wyjaśnić różnicę?jquery.each() - "this" vs valueOfElement

Przykład:

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

Wynik:

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

Fiddle

Odpowiedz

14

Odpowiedź jest w dokumentacji, którą powiązany:

Wartość można uzyskać także poprzez to słowo kluczowe, ale Javascript będzie zawsze zawijał tę wartość jako obiekt, nawet jeśli jest to prosty ciąg lub wartość liczbowa.

Wszystkie wartości są osadzone w obiektach, gdy są dostępne jako this.

Prawdziwy powód można znaleźć w tej linii jQuery source:

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

można porównać go do

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

który buduje Number, ponieważ nie można wywołać funkcję na coś to nie jest przedmiot.

Od MDN on the call function:

thisArg:

Należy pamiętać, że to nie może być rzeczywista wartość postrzegana przez metodę: jeśli metoda jest funkcją w niewyspecjalizowanych surowego kodeksu trybu, null undefined zostanie zastąpiony przez obiekt globalny, a wartością pierwotną będzie w pudełku.

jedyne zalety chciałbym zobaczyć w użyciu this zamiast valueOfElement są:

  • prostota: nie trzeba mieć na uwadze kolejność argumentów podanych do zwrotnego
  • umiejętność użyć funkcji bezpośrednio na this nawet jeśli valueOfElement jest prymitywnego typu
+0

Dobra, czy korzystałaby z nich jedna na drugiej? valueOfElement w porównaniu z tym, to jest. – Johan

+2

Świetne wyjaśnienie! –

+0

Co robisz ?! Przestań to ulepszać! Już dobrze: D – VisioN

0

WIL this kluczowe l uzyskuję dostęp do elementu jako obiektu JavaScript. Możesz uzyskać jego wartość w taki sam sposób jak dowolny inny obiekt JavaScript lub możesz go zawinąć ($(this)), aby przekształcić go w obiekt jQuery.

Powiązane problemy