Chrome中的“Uncaught TypeError:非法调用”
当我使用requestAnimationFrame
来做一些原生支持的animation和下面的代码:
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:非法调用
在Chrome中。 为什么?
在您的代码中,您将自定义对象的属性分配给本地方法。 当你调用support.animationFrame(function () {})
,它会在当前对象(即支持)的上下文中执行。 为了让本地的requestAnimationFrame函数正常工作,它必须在window
的上下文中执行。
所以这里的正确用法是support.animationFrame.call(window, function() {});
。
警报也一样:
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
另一种select是使用Function.prototype.bind() ,它是ES5标准的一部分,可在所有现代浏览器中使用。
var _raf = window.requestAnimationFrame || window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame || window.msRequestAnimationFrame || window.oRequestAnimationFrame; var support = { animationFrame: _raf ? _raf.bind(window) : null };
你也可以使用:
var obj = { alert: alert.bind(window) }; obj.alert('I´m an alert!!');
当你执行一个方法(即分配给一个对象的函数)时,你可以使用this
variables来引用这个对象,例如:
var obj = { someProperty: true, someMethod: function() { console.log(this.someProperty); } }; obj.someMethod(); // logs true