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
documenty será accesiblethismediante la implementación de ese método.Cuando simplemente llamas
q, ya no hay contexto, sino elwindowobjeto "global" .La implementación de
querySelectorAllintenta usarthispero ya no es un elemento DOM, es unWindowobjeto. La implementación intenta llamar a algún método de un elemento DOM que no existe en unWindowobjeto y, como era de esperar, el intérprete llama a foul.Para resolver esto, use
.binden versiones más recientes de Javascript:var q = document.querySelectorAll.bind(document);lo que asegurará que todas las invocaciones posteriores de
qtengan 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
somethingmé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