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 sea necesario. Por un lado, no es el caso de 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?
javascript
invocation
usuario1152187
fuente
fuente
Respuestas:
Es porque ha perdido el "contexto" de la función.
Cuando usted llama:
document.querySelectorAll()
el contexto de la función es
document
y será accesiblethis
mediante la implementación de ese método.Cuando simplemente llamas
q
, ya no hay contexto, sino elwindow
objeto "global" .La implementación de
querySelectorAll
intenta usarthis
pero ya no es un elemento DOM, es unWindow
objeto. La implementación intenta llamar a algún método de un elemento DOM que no existe en unWindow
objeto y, como era de esperar, el intérprete llama a foul.Para resolver esto, use
.bind
en 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 lo tiene.bind
, use esto:function q() { return document.querySelectorAll.apply(document, arguments); }
fuente
function q(x){ return document.querySelectorAll(x); }
. Otra cosa que realmente me gusta de los objetos del navegador IE es que algunos de ellos lanzan una excepción solo si intentas leer una propiedad de ellos, ¡así que necesitas probar características con enif( 'funcname' in browserobject)
lugar de lo habitualif(browserobject.funcname)
!En mi caso, se produjo una invocación ilegal debido al paso de una variable no declarada para que funcione como argumento. Asegúrese de declarar la variable antes de pasar a la función.
fuente
something
método pierde el contexto del documentopuedes usar así:
let qsa = document.querySelectorAll; qsa.apply(document,['body']);
fuente
Una solución más concisa:
const q=s=>document.querySelectorAll(s); q('body');
fuente