trigger - method javascript
¿Por qué ciertas llamadas de función se denominan "invocaciones ilegales" en JavaScript? (3)
Por ejemplo, si hago esto:
var q = document.querySelectorAll;
q(''body'');
Recibo un error de "Invocación ilegal" en Chrome. No puedo pensar en ninguna razón por la que esto es necesario. Por un lado, no es el caso con todas las funciones de código nativo. De hecho puedo hacer esto:
var o = Object; // which is a native code function
var x = new o();
Y todo funciona bien. En particular, he descubierto este problema al tratar con documentos y consolas. ¿Alguna idea?
En mi caso, se produjo una invocación ilegal debido a que se pasó una variable no declarada para funcionar como argumento. Asegúrese de declarar la variable antes de pasar a la función.
Es porque has perdido el "contexto" de la función.
Cuando usted llama:
document.querySelectorAll()
El contexto de la función es el document
, y será accesible a través de la implementación de ese método.
Cuando solo llamas a q
ya no hay contexto, es el objeto de window
"global".
La implementación de querySelectorAll
intenta usar this
pero ya no es un elemento DOM, es un objeto Window
. La implementación intenta llamar a algún método de un elemento DOM que no existe en un objeto Window
y el intérprete, como es lógico, llama foul.
Para resolver esto, use .bind
en las versiones más recientes de Javascript:
var q = document.querySelectorAll.bind(document);
lo que asegurará que todas las invocaciones posteriores de q
tengan el contexto correcto. Si no tienes .bind
, usa esto:
function q() {
return document.querySelectorAll.apply(document, arguments);
}
Se puede usar así:
let qsa = document.querySelectorAll;
qsa.apply(document,[''body'']);