Un raccourci pour Function.prototype.call.call?

Moyens d'appeler une fonction

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

Un raccourci pour la manière fonctionnelle

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.