Par exemple, si je fais ceci:
var q = document.querySelectorAll;
q('body');
J'obtiens une erreur "Invocation illégale" dans Chrome. Je ne vois aucune raison pour laquelle cela est nécessaire. D'une part, ce n'est pas le cas avec toutes les fonctions de code natif. En fait, je peux faire ceci:
var o = Object; // which is a native code function
var x = new o();
Et tout fonctionne très bien. En particulier, j'ai découvert ce problème en traitant le document et la console. Des pensées?
javascript
invocation
user1152187
la source
la source
Réponses:
C'est parce que vous avez perdu le «contexte» de la fonction.
Quand vous appelez:
le contexte de la fonction est
document
, et sera accessible commethis
par la mise en œuvre de cette méthode.Lorsque vous appelez simplement,
q
il n'y a plus de contexte - c'est l'window
objet "global" à la place.L'implémentation de
querySelectorAll
essaie d'utiliserthis
mais ce n'est plus un élément DOM, c'est unWindow
objet. L'implémentation essaie d'appeler une méthode d'un élément DOM qui n'existe pas sur unWindow
objet et l'interpréteur appelle sans surprise faute.Pour résoudre ce problème, utilisez
.bind
dans les versions plus récentes de Javascript:qui garantira que toutes les invocations ultérieures de
q
ont le bon contexte. Si vous ne l'avez pas.bind
, utilisez ceci:la source
function q(x){ return document.querySelectorAll(x); }
. Une autre chose que j'aime vraiment à propos des objets de navigateur IE est que certains d'entre eux lancent une exception juste si vous essayez de lire une propriété d'eux, vous devez donc tester les fonctionnalités avecif( 'funcname' in browserobject)
au lieu de l'habituelif(browserobject.funcname)
!Dans mon cas, une invocation illégale s'est produite en raison du passage d'une variable non déclarée à une fonction en tant qu'argument. Assurez-vous de déclarer la variable avant de passer à la fonction.
la source
something
documentvous pouvez utiliser comme ceci:
la source
Encore une solution concise:
la source