Quand j'utilise requestAnimationFrame
pour faire une animation native prise en charge avec le code ci-dessous:
var support = {
animationFrame: window.requestAnimationFrame ||
window.mozRequestAnimationFrame ||
window.webkitRequestAnimationFrame ||
window.msRequestAnimationFrame ||
window.oRequestAnimationFrame
};
support.animationFrame(function() {}); //error
support.animationFrame.call(window, function() {}); //right
Appelez directement le support.animationFrame
testament ...
Uncaught TypeError: invocation illégale
dans Chrome. Pourquoi?
myObj.myAlert('this is an alert');
est illégal. L'utilisation correcte estmyObj.myAlert.call(window, 'this is an alert')
. Veuillez lire les réponses correctement et essayez de les comprendre.Vous pouvez aussi utiliser:
la source
var realReplaceState = history.replaceState.bind(history);
.bind(localStorage)
, non.bind(window)
.Lorsque vous exécutez une méthode (c'est-à-dire une fonction affectée à un objet), à l'intérieur, vous pouvez utiliser une
this
variable pour faire référence à cet objet, par exemple:Si vous affectez une méthode d'un objet à un autre, sa
this
variable fait référence au nouvel objet, par exemple:La même chose se produit lorsque vous affectez la
requestAnimationFrame
méthode dewindow
à un autre objet. Les fonctions natives, comme celle-ci, ont une protection intégrée contre son exécution dans un autre contexte.Il existe une
Function.prototype.call()
fonction qui vous permet d'appeler une fonction dans un autre contexte. Il suffit de le passer (l'objet qui servira de contexte) comme premier paramètre à cette méthode. Par exemplealert.call({})
donneTypeError: Illegal invocation
. Cependant,alert.call(window)
fonctionne bien, car maintenantalert
est exécuté dans sa portée d'origine.Si vous utilisez
.call()
avec votre objet comme ça:cela fonctionne bien, car il
requestAnimationFrame
est exécuté dans la portée de lawindow
place de votre objet.Cependant, utiliser
.call()
chaque fois que vous souhaitez appeler cette méthode n'est pas une solution très élégante. Au lieu de cela, vous pouvez utiliserFunction.prototype.bind()
. Il a un effet similaire à.call()
, mais au lieu d'appeler la fonction, il crée une nouvelle fonction qui sera toujours appelée dans le contexte spécifié. Par exemple:Le seul inconvénient
Function.prototype.bind()
est qu'il fait partie d'ECMAScript 5, qui n'est pas pris en charge dans IE <= 8 . Heureusement, il existe un polyfill sur MDN .Comme vous l'avez probablement déjà compris, vous pouvez utiliser
.bind()
pour toujours exécuterrequestAnimationFrame
dans le contexte dewindow
. Votre code pourrait ressembler à ceci:Ensuite, vous pouvez simplement utiliser
support.animationFrame(function() {});
.la source