gpt4 book ai didi

javascript - Chrome 中的 "Uncaught TypeError: Illegal invocation"

转载 作者:IT王子 更新时间:2023-10-29 02:38:19 27 4
gpt4 key购买 nike

当我使用 requestAnimationFrame 做一些本地支持的动画时,代码如下:

var support = {
animationFrame: window.requestAnimationFrame ||
window.mozRequestAnimationFrame ||
window.webkitRequestAnimationFrame ||
window.msRequestAnimationFrame ||
window.oRequestAnimationFrame
};

support.animationFrame(function() {}); //error

support.animationFrame.call(window, function() {}); //right

直接调用support.animationFrame 会给出...

Uncaught TypeError: Illegal invocation

在 Chrome 中。为什么?

最佳答案

在您的代码中,您将本地方法分配给自定义对象的属性。当您调用 support.animationFrame(function () {}) 时,它会在当前对象(即支持)的上下文中执行。要使 native requestAnimationFrame 函数正常工作,它必须在 window 的上下文中执行。

所以这里正确的用法是support.animationFrame.call(window, function() {});

同样的情况也发生在 alert 上:

var myObj = {
myAlert : alert //copying native alert to an object
};

myObj.myAlert('this is an alert'); //is illegal
myObj.myAlert.call(window, 'this is an alert'); // executing in context of window

另一种选择是使用 Function.prototype.bind()这是 ES5 标准的一部分,适用于所有现代浏览器。

var _raf = window.requestAnimationFrame ||
window.mozRequestAnimationFrame ||
window.webkitRequestAnimationFrame ||
window.msRequestAnimationFrame ||
window.oRequestAnimationFrame;

var support = {
animationFrame: _raf ? _raf.bind(window) : null
};

关于javascript - Chrome 中的 "Uncaught TypeError: Illegal invocation",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9677985/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com