Zum Beispiel, wenn ich das mache:
var q = document.querySelectorAll;
q('body');
In Chrome wird der Fehler "Unzulässiger Aufruf" angezeigt. Ich kann mir keinen Grund vorstellen, warum dies notwendig ist. Zum einen ist dies nicht bei allen nativen Codefunktionen der Fall. Tatsächlich kann ich das tun:
var o = Object; // which is a native code function
var x = new o();
Und alles funktioniert gut. Insbesondere habe ich dieses Problem beim Umgang mit Dokumenten und Konsolen entdeckt. Irgendwelche Gedanken?
javascript
invocation
user1152187
quelle
quelle
Antworten:
Das liegt daran, dass Sie den "Kontext" der Funktion verloren haben.
Wenn du anrufst:
Der Kontext der Funktion ist
document
und wird wiethis
bei der Implementierung dieser Methode zugänglich sein .Wenn Sie nur aufrufen,
q
gibt es keinen Kontext mehr - es istwindow
stattdessen das "globale" Objekt.Die Implementierung von
querySelectorAll
versucht zu verwenden,this
aber es ist kein DOM-Element mehr, es ist einWindow
Objekt. Die Implementierung versucht, eine Methode eines DOM-Elements aufzurufen, die für einWindow
Objekt nicht vorhanden ist, und der Interpreter ruft nicht überraschend Foul auf.Verwenden Sie
.bind
in neueren Versionen von Javascript Folgendes, um dieses Problem zu beheben :Dadurch wird sichergestellt, dass alle nachfolgenden Aufrufe von
q
den richtigen Kontext haben. Wenn Sie nicht haben.bind
, verwenden Sie dies:quelle
function q(x){ return document.querySelectorAll(x); }
. Eine andere Sache, die ich an IE-Browserobjekten wirklich mag, ist, dass einige von ihnen eine Ausnahme auslösen, nur wenn Sie versuchen, eine Eigenschaft von ihnen zu lesen, sodass Sie Funktionenif( 'funcname' in browserobject)
anstelle der üblichen testen müssenif(browserobject.funcname)
!In meinem Fall ist ein illegaler Aufruf aufgetreten, weil eine nicht deklarierte Variable als Argument übergeben wurde. Stellen Sie sicher, dass Sie die Variable deklarieren, bevor Sie an die Funktion übergeben.
quelle
something
Methode in dem Moment, in dem Sie q = document tun, den Kontext des DokumentsSie können wie folgt verwenden:
quelle
Noch eine prägnante Lösung:
quelle