überschreibt eine globale Funktion in Javascript

8

Ich versuche, der JavaScript-setTimeout-Funktion meine eigene Fehlerbehandlung hinzuzufügen. Der folgende Code funktioniert in Chrome:

%Vor%

Aber in IE7 wird es zu einer rekursiven Funktion. Aus irgendeinem Grund wird oldSetTimeout auf die neue Funktion gesetzt.

Irgendwelche Vorschläge?


Randnotiz: Ja, ich muss es so machen. Ich benutze einen Stapel von 3rd-Party-Bibliotheken, die alle nicht gut mit setTimeout umgehen, also kann ich nicht einfach die Aufrufe von setTimeout ändern.     
alumb 28.09.2010, 17:12
quelle

2 Antworten

17

Dies liegt daran, dass Sie benannte Funktionsausdrücke verwenden, die im IE nicht korrekt implementiert sind. Durch das Entfernen der Funktionsnamen wird das unmittelbare Problem behoben. Siehe kangax ausgezeichneten Artikel auf dieses Thema . Es gibt jedoch ein anderes Problem, das nicht so einfach behoben werden kann.

Im Allgemeinen ist es keine gute Idee, Eigenschaften von Hostobjekten (wie window , document oder ein beliebiges DOM-Element) außer Kraft zu setzen, da es keine Garantie dafür gibt, dass die Umgebung dies zulässt. Host-Objekte sind nicht an dieselben Regeln wie native Objekte gebunden und können im Wesentlichen tun, was sie wollen. Es gibt auch keine Garantie dafür, dass eine Host-Methode ein Function -Objekt ist und daher oldSetTimeout möglicherweise nicht immer eine apply() -Methode hat. Dies ist in IE der Fall, daher wird der Aufruf von oldSetTimeout.apply(this, args); nicht funktionieren.

Ich würde stattdessen Folgendes vorschlagen:

%Vor%     
Tim Down 28.09.2010, 17:22
quelle
3

Kleine Verbesserung der Antwort von Tim Down, um das Original noch mehr nachzuahmen:

%Vor%     
Tim 16.07.2013 12:17
quelle