¿Por qué son ciertas llamadas a la función denominada «ilegal invocaciones» en JavaScript?

Por ejemplo, si yo hago esto:

var q = document.querySelectorAll;

q('body');

Puedo obtener un «Ilegal invocación» error en Chrome. No puedo pensar en ninguna razón por qué esto es necesario. Para uno, no es el caso con todas las funciones de código. 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 cuando se trata con el documento y la consola. Los pensamientos?

InformationsquelleAutor user1152187 | 2012-05-24

3 Kommentare

  1. 130

    Es porque ha perdido el «contexto» de la función.

    Cuando llame:

    document.querySelectorAll()

    el contexto de la función es document, y será accesible como this por la aplicación de ese método.

    Cuando usted acaba de llamar q ya no hay un contexto – es el «global» window objeto en su lugar.

    La aplicación de querySelectorAll intenta utilizar this pero deja de ser un elemento de DOM, es una Window objeto. La aplicación intenta llamar a un método de un elemento DOM que no existe en un Window objeto y el intérprete como era de esperar llamadas de foul.

    Para resolver este problema, utilice .bind en las nuevas versiones de Javascript:

    var q = document.querySelectorAll.bind(document);

    que se asegurará de que todas las llamadas posteriores de q tiene el derecho de contexto. Si no tienes .bind, utilice esto:

    function q() {
        return document.querySelectorAll.apply(document, arguments);
    }
    • Oh, bueno llame. Tienes razón porque puedo hacer: p.aplicar(documento, [‘cuerpo’]); y funciona.
    • Tenga en cuenta que esto no necessarilty de trabajo para las funciones integradas en el IE. Por ejemplo, de la consola.registro no tiene un método aplicar allí.
    • está bien en Chrome, sin embargo, otra es decir «especial» supongo – suspiro…
    • Sí, funciona en todas partes excepto IE y es por eso que usted debe a menudo acaba de pasar argumentos normalmente, como en function q(x){ return document.querySelectorAll(x); }. Otra cosa que me gusta acerca de explorador de internet de los objetos es que algunos de ellos lanzar una excepción si se intenta leer una propiedad de ellos, entonces usted necesita para poner a prueba las características con if( 'funcname' in browserobject) en lugar de la habitual if(browserobject.funcname)!
    • Excelente respuesta, yo estaba muy confundido por este fenómeno, exactamente la misma situación, como OP.
    • La mente de soplado. Gracias.

  2. -2

    En mi caso Ilegales invocación se produjo debido a la aprobación de variables no declaradas a la función como argumento.
    Asegúrese de declarar la variable antes de pasar a la función.

    • declarar la variable no tener sentido para este caso en particular como ilegal invocación que está sucediendo como dom dependiente del método que se llama fuera del contexto de DOM, porque en el momento de hacer q = documento.algo que el something método pierde el contexto del documento

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea