2013-02-20 6 views
6

J'ai une fonction iterator tableau:JavaScript: résultat inattendu typeof

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

et un code

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

Pourquoi typeof this dans la fonction en ligne object au lieu de string?

jsFiddle here

+1

Juste une note. Je crois que la dernière instruction devrait être 'typeof this === typeof val' au lieu de' typeof (this === val) ' – techfoobar

+0

Parce que' this' ne fait plus référence à 'arr1'. Une fois que vous utilisez 'this' dans la fonction, il se réfère à cette' fonction' qui est un objet. –

+1

@icanc - Ce n'est pas vrai. Le premier argument de '.call()' décide de ce que 'this' est dans la fonction. – techfoobar

Répondre

8

Lorsqu'une méthode est appelée en JavaScript, il définit en interne this à l'objet appelant: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Function/apply

... et les valeurs primitives seront encadrées.

Par "encadré", ils signifient que la primitive est enveloppée dans un objet. Notez que cela s'applique uniquement au premier argument à apply/call. Les autres arguments deviennent des paramètres de fonction qui ne sont pas "encadrés".

+2

Battez-moi par secondes, mais j'ai appris quelque chose! – danronmoon