Pourquoi ne puis-je pas .call () Function.call?

En Javascript, Function.call() peut appeler Function avec this valeur et zéro ou plus d'arguments.

Function.call lui-même est une fonction. Donc, en théorie, Function.call devrait être la même fonction (ou agissant de manière similaire) comme Function.call.call .

Dans V8, cela semble être le cas:

 > Function.call === Function.call.call true 

Lorsque nous appelons Function.call() , nous obtenons une fonction anonyme

 > Function.call() [Function: anonymous] 

Cependant, je ne peux pas appeler .call() sur Function.call .

 > Function.call.call() TypeError: undefined is not a function at repl:1:21 at REPLServer.defaultEval (repl.js:132:27) at bound (domain.js:291:14) at REPLServer.runBound [as eval] (domain.js:304:12) at REPLServer.<anonymous> (repl.js:279:12) at REPLServer.emit (events.js:107:17) at REPLServer.Interface._onLine (readline.js:214:10) at REPLServer.Interface._line (readline.js:553:8) at REPLServer.Interface._ttyWrite (readline.js:830:14) at ReadStream.onkeypress (readline.js:109:10) 

Qu'est-ce qui se passe ici? Function.call est clairement une fonction – elle n'est pas undefined comme le suggère ce message d'erreur.

Réponse courte: le message d'erreur est très trompeur. C'est le même message d'erreur que vous obtenez lorsque vous faites

 (undefined)(); 

Réponse plus longue:

La seconde .call() est appelée avec this of Function.call .

En l'appelant sans paramètres, il l'appelle avec une valeur undefined comme valeur.

Par conséquent, vous faites vraiment

 Function.call.call(undefined) 

Ce qui signifie que vous (métaphoriquement) faites

 undefined.call() 

Qui est vraiment juste

 undefined() 

Passer rien (ou undefined ) au paramètre this de Function.call.call() est essentiellement en train de nier le contexte de la première Function.call() (qui serait juste la Function elle-même), en provoquant .call() undefined .

Cela produit le message d'erreur qui est produit: undefined is not a function .