Considérez cette fonction simple:
function my(p) { console.log(p) }
Je peux l'appeler comme ceci:
my("Hello");
Et aussi comme ça:
my.call(this, "Hello");
De plus, ceci est possible:
Function.prototype.call.call(my, this, "Hello");
Je suis intéressé par la dernière option – la plus fonctionnelle, mais comme c'est trop long, j'ai essayé de faire une sténographie:
var call = Function.prototype.call.call;
Pour appeler ça comme ceci:
call(my, this, "Hello");
Mais je reçois ce TypeError:
TypeError: Function.prototype.call called on incompatible undefined
Quelqu'un sait, qu'est ce qui ne va pas ici?
Quand tu dis
var call = Function.prototype.call.call;
Le dernier call
perd son contexte actuel. Vous devez indiquer explicitement que l' call
appartient à Function.prototype.call
.
Vous pouvez le faire en créant une nouvelle fonction qui l'associe comme celle-ci
var call = Function.prototype.call.call.bind(Function.prototype.call); call(my, this, "Hello"); // Hello
La fonction bind
renvoie une nouvelle fonction qui, lorsqu'elle est appelée, aura le contexte ( this
) défini comme Function.prototype.call
.
call
, sans doute, fait usage de this
interne.
En l'appelant sans contexte, vous avez changé la valeur interne de this
qui a accès au prototype de fonction à la window
.
Si vous voulez le faire, considérez ceci (si vous avez un interpréteur compatible ES5):
var call = Function.prototype.call.bind(Function.prototype.call)
La fonction bind assure que le contexte (la variable this
) lors de l'appel de la fonction est Function.prototype.call
au lieu de undefined
, comme vous le voyez dans votre cas.