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
.