2013-02-20 15 views
6

Ho una funzione di matrice iteratore:JavaScript: inaspettato risultato typeof

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

e un codice

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 
}); 

Perché typeof this all'interno della funzione inline object invece di string?

jsfiddle here

+1

Solo una nota. Credo che l'ultima affermazione dovrebbe essere 'typeof this === typeof val' invece di' typeof (this === val) ' – techfoobar

+0

Perché' this' non si riferisce più al 'arr1'. Una volta che si usa 'this' nella funzione si riferisce a' function' che è un oggetto. –

+1

@icanc - Non è vero. Il primo argomento su '.call()' decide che cosa 'questo' si trova all'interno della funzione. – techfoobar

risposta

8

Quando un metodo viene chiamato in JavaScript, imposta internamente this per l'oggetto chiamante: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Function/apply

... e valori primitivi sono imballati.

Per "riquadrato", indicano che la primitiva è avvolta in un oggetto. Notare che ciò si applica solo al primo argomento a apply/call. Gli altri argomenti diventano parametri di funzione che non sono "riquadrati".

+2

Picchiami per secondi, ma ho imparato qualcosa! – danronmoon