Warum kann ich document.getElementById nicht direkt einer anderen Funktion zuweisen?

8

Ich versuche also, eine Funktion g () zu definieren, die wie document.getElementById ist. Folgendes funktioniert gut:

%Vor%

Aber warum funktioniert dieser direktere Code nicht?

%Vor%     
zjmiller 11.06.2011, 21:40
quelle

5 Antworten

12

Das Problem ist das von Kontext . Wenn Sie eine Objektfunktion auslösen, wird sie mit dem Objekt als Wert von this ausgelöst (sofern Sie nichts anderes angeben). g = document.getElementById setzt die Funktion getElementById in die Variable g , setzt aber den Kontext nicht.

Wenn Sie also g(someId) ausführen, gibt es keinen Kontext, in dem die Funktion ausgeführt werden kann. Es wird mit dem globalen Objekt window als Wert von this ausgeführt, und das funktioniert nicht. (Um genau zu sein, es funktioniert nicht, weil Sie mit einem document -Objekt arbeiten könnten, nicht nur mit window.document , und Sie haben noch keins angegeben.)

Sie könnten dies mit call umgehen, wo Sie den Kontext setzen:

%Vor%

Dies ist jedoch keine Verbesserung gegenüber dem Original!

    
lonesomeday 11.06.2011, 21:46
quelle
2

Weil, wenn Sie "g ('somestr')" aufrufen, der "this" -Wert an das "window" gebunden ist und "document.getElementById" erwartet, dass er an "document" anstatt an "window" gebunden ist (sinnvoll) zu mir =)). Tun:

%Vor%

ist wie:

%Vor%     
Prusse 11.06.2011 21:47
quelle
1

Das Problem ist der Kontext . document.getElementById(xxx) wird im Kontext von document ausgeführt, aber wenn Sie etwas zuweisen, erhalten Sie einen TypeError, weil der Kontext wahrscheinlich window ist. Siehe dieses jsFiddle: Ссылка

Also könnten Sie call oder apply verwenden, aber das ist hässlich. Tun Sie stattdessen die zweite Möglichkeit, oder weisen Sie sie document zu und weisen Sie document etwas zu, wenn Sie Ihren Code minimieren möchten.

    
Ry︁ 11.06.2011 21:50
quelle
0

@minitech und @Tim Down Vielen Dank für Ihr Feedback.

Wir haben eine Menge alten Code, der so funktioniert

%Vor%

Es fehlgeschlagen mit Fehlermeldung in modernen Browsern Uncaught TypeError: Illegaler Aufruf

Alles, was ich getan habe, wurde als

ersetzt %Vor%

Jetzt sind wir wieder im Spiel:)

    
Sanket Sonavane 13.11.2014 14:15
quelle
0

Wie die Antwort von lonesomeday bereits zeigt, liegt das Problem im Ausführungskontext. Ich möchte hinzufügen, dass es eine Möglichkeit gibt, eine Funktion mit dem Ausführungskontext zu erstellen. Öffnen Sie die Entwicklertools Ihres Browsers für diese Seite und versuchen Sie Folgendes in der Konsole:

%Vor%

Nach wie vor wird die Variable _d , die document.getElementById zugeordnet ist, direkt aufgerufen. Sie können jedoch Function.prototype.bind verwenden, um den Ausführungskontext zu binden .

  

Die bind() -Methode erstellt eine neue Funktion, deren this-Schlüsselwort beim Aufruf auf den angegebenen Wert gesetzt wird, wobei eine gegebene Argumentfolge vor allen angegebenen steht, wenn die neue Funktion aufgerufen wird.

%Vor%

Sie müssen sich auch nicht viel Gedanken über die Browserkompatibilität machen, wenn Sie bind verwenden möchten: Siehe Ссылка .

    
Krumia 17.01.2018 08:40
quelle

Tags und Links