Pesquisa de site

Por que certas chamadas de função são chamadas de "invocações ilegais" em JavaScript?


Por exemplo, se eu fizer isso:

var q = document.querySelectorAll;

q('body');

Recebo um erro de "invocação ilegal" no Chrome. Não consigo pensar em nenhum motivo pelo qual isso seja necessário. Por um lado, não é o caso com todas as funções de código nativo. Na verdade, eu posso fazer isto:

var o = Object; // which is a native code function

var x = new o();

E tudo funciona muito bem. Em particular, descobri esse problema ao lidar com documento e console. Alguma ideia?

Resposta #1

É porque você perdeu o "contexto" da função.

Quando você ligar:

document.querySelectorAll()

o contexto da função é document, e será acessível como this pela implementação desse método.

Quando você apenas chama q, não há mais um contexto - é o objeto window "global" em vez disso.

A implementação de querySelectorAll tenta usar this, mas ele não é mais um elemento DOM, é um objeto Window. A implementação tenta chamar algum método de um elemento DOM que não existe em um objeto Window e o interpretador, sem surpresa, indica erro.

Para resolver isso, use .bind nas versões mais recentes do Javascript:

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

o que garantirá que todas as chamadas subsequentes de q tenham o contexto correto. Se você não tiver .bind, use isto:

function q() {
    return document.querySelectorAll.apply(document, arguments);
}

Artigos relacionados