2013-02-20 16 views
6

Mam funkcję tablicy iteratora:JavaScript: nieoczekiwany wynik typeof

function applyCall(arr, fn) { 
    fn.call(arr[0], 0, arr[0]); 
} 

i trochę kodu

var arr1 = ['blah']; 
applyCall(arr1, function (i, val) { 
    alert(typeof this); // object WHY?? 
    alert(typeof val); // string 
    alert(typeof(this === val)) // alerts false, expecting true 
}); 

Dlaczego typeof this wewnątrz funkcji inline object zamiast string?

jsfiddle here

+1

Tylko notatkę. Wierzę, że ostatnie zdanie powinno brzmieć "typeof this === typeof val' zamiast" typeof (this === val) ' – techfoobar

+0

Ponieważ' this' nie odnosi się już do 'arr1'. Po użyciu 'this' w funkcji odwołuje się do' funkcji', która jest obiektem. –

+1

@icanc - To nie jest prawda. Pierwszy argument funkcji .call() decyduje o tym, co to jest wewnątrz funkcji. – techfoobar

Odpowiedz

8

Gdy metoda jest wywoływana w JavaScripcie, to wewnętrznie ustawia this do obiektu wywołującego: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Function/apply

... i wartości prymitywne zostaną zapakowane.

Przez "zapakowane" rozumie się, że prymityw jest zawinięty w Obiekt. Zauważ, że odnosi się to tylko do pierwszego argumentu do apply/call. Pozostałe argumenty stają się parametrami funkcji, które nie są "pudełkowane".

+2

Pokonaj mnie sekundami, ale nauczyłem się czegoś! – danronmoon