Wenn ich requestAnimationFrame
eine native unterstützte Animation mit dem folgenden Code mache:
var support = {
animationFrame: window.requestAnimationFrame ||
window.mozRequestAnimationFrame ||
window.webkitRequestAnimationFrame ||
window.msRequestAnimationFrame ||
window.oRequestAnimationFrame
};
support.animationFrame(function() {}); //error
support.animationFrame.call(window, function() {}); //right
Direkt anrufen support.animationFrame
wird geben ...
Nicht erfasster TypeError: Unzulässiger Aufruf
in Chrome. Warum?
quelle
myObj.myAlert('this is an alert');
illegal ist. Richtige Verwendung istmyObj.myAlert.call(window, 'this is an alert')
. Bitte lesen Sie die Antworten richtig und versuchen Sie sie zu verstehen.Sie können auch verwenden:
quelle
var realReplaceState = history.replaceState.bind(history);
.bind(localStorage)
nicht tun.bind(window)
.Wenn Sie eine Methode ausführen (dh eine einem Objekt zugewiesene Funktion), können Sie darin eine
this
Variable verwenden, um auf dieses Objekt zu verweisen, zum Beispiel:Wenn Sie eine Methode von einem Objekt zu einem anderen zuweisen,
this
bezieht sich ihre Variable auf das neue Objekt, zum Beispiel:Das gleiche passiert, wenn Sie einem anderen Objekt eine
requestAnimationFrame
Methode zuweisenwindow
. Native Funktionen wie diese verfügen über einen integrierten Schutz vor der Ausführung in einem anderen Kontext.Es gibt eine
Function.prototype.call()
Funktion, mit der Sie eine Funktion in einem anderen Kontext aufrufen können. Sie müssen es nur (das Objekt, das als Kontext verwendet wird) als ersten Parameter an diese Methode übergeben. Zum Beispielalert.call({})
gibtTypeError: Illegal invocation
. Funktioniert jedochalert.call(window)
einwandfrei, da jetztalert
im ursprünglichen Bereich ausgeführt wird.Wenn Sie
.call()
mit Ihrem Objekt so verwenden:es funktioniert gut, weil
requestAnimationFrame
es im Bereich vonwindow
anstelle Ihres Objekts ausgeführt wird.Es
.call()
ist jedoch keine sehr elegante Lösung , jedes Mal zu verwenden, wenn Sie diese Methode aufrufen möchten. Stattdessen können Sie verwendenFunction.prototype.bind()
. Es hat einen ähnlichen Effekt wie.call()
, aber anstatt die Funktion aufzurufen, wird eine neue Funktion erstellt, die immer im angegebenen Kontext aufgerufen wird. Beispielsweise:Der einzige Nachteil
Function.prototype.bind()
ist, dass es Teil von ECMAScript 5 ist, das in IE <= 8 nicht unterstützt wird . Glücklicherweise gibt es eine Polyfüllung auf MDN .Wie Sie wahrscheinlich bereits herausgefunden haben, können Sie verwenden,
.bind()
um immerrequestAnimationFrame
im Kontext von auszuführenwindow
. Ihr Code könnte folgendermaßen aussehen:Dann können Sie einfach verwenden
support.animationFrame(function() {});
.quelle