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);
}
