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 para isso ser necessário. Por um lado, não é o caso com todas as funções de código nativo. Na verdade, posso fazer isso:
var o = Object; // which is a native code function
var x = new o();
E tudo funciona bem. Em particular, descobri esse problema ao lidar com documentos e console. Alguma ideia?
javascript
invocation
user1152187
fonte
fonte
Respostas:
É porque você perdeu o "contexto" da função.
Quando Você ligar:
o contexto da função é
document
e estará acessível conformethis
a implementação desse método.Quando você apenas chama,
q
não há mais contexto - é owindow
objeto "global" .A implementação de
querySelectorAll
tenta usar,this
mas não é mais um elemento DOM, é umWindow
objeto. A implementação tenta chamar algum método de um elemento DOM que não existe em umWindow
objeto e o interpretador chama foul sem surpresa.Para resolver isso, use
.bind
em versões mais recentes de Javascript:o que garantirá que todas as invocações subsequentes de
q
tenham o contexto correto. Se você não tem.bind
, use isto:fonte
function q(x){ return document.querySelectorAll(x); }
. Outra coisa que eu realmente gosto sobre os objetos do navegador IE é que alguns deles lançam uma exceção apenas se você tentar ler uma propriedade deles, então você precisa testar os recursos emif( 'funcname' in browserobject)
vez do usualif(browserobject.funcname)
!No meu caso, a invocação ilegal ocorreu devido à passagem de uma variável não declarada para funcionar como argumento. Certifique-se de declarar a variável antes de passar para a função.
fonte
something
método perde o contexto do documentovocê pode usar assim:
fonte
Mais uma solução concisa:
fonte