以下代码是有效的JavaScript,但在打字稿中会引发以下错误。任何想法为什么?来自有效JavaScript的TypeScript错误
错误7名“gameloop”不当前范围存在
(function gameloop() {
window.requestAnimationFrame(gameloop);
})();
编辑:后第一个答案注意到,是不相关的实际问题,复制和粘贴错误。
以下代码是有效的JavaScript,但在打字稿中会引发以下错误。任何想法为什么?来自有效JavaScript的TypeScript错误
错误7名“gameloop”不当前范围存在
(function gameloop() {
window.requestAnimationFrame(gameloop);
})();
编辑:后第一个答案注意到,是不相关的实际问题,复制和粘贴错误。
我也运行到这一点,但它需要不同的修补程序。就我而言,我使用TypeScript中的window.requestAnimationFrame,然后在Chrome上运行代码。但是,我得到了一个运行时错误,“窗口没有requestAnimationFrame”。这是因为requestAnimationFrame在Chrome中仍然是前缀。你需要为你的TypeScript声明添加一个前缀声明,或者只需要添加一个JavaScript文件到你的项目中,以标准方式叠加window.requestAnimationFrame;
// requestAnimFrame shim with setTimeout fallback
window.requestAnimationFrame = (function() {
return window.requestAnimationFrame ||
window.webkitRequestAnimationFrame ||
window.mozRequestAnimationFrame ||
window.oRequestAnimationFrame ||
window.msRequestAnimationFrame ||
function (callback) {
window.setTimeout(callback, 1000/60);
};
})();
我用填充工具方法,使requestAnimationFrame工作对铬,因为它是一个通用的修复。 polyfill本身可以用纯粹的TypeScript来编写,但是Javascript很干净而且容易,当Chrome删除前缀而不影响你的TypeScript时,你可以删除它。
这只是一个缺少的分号,无法在Javascript和Typescript中正确使用。
这应该工作:
var game = new Game(); // <== don't forget ';' here
(function gameloop() {
// stats.update();
game.step();
game.update();
game.draw();
window.requestAnimationFrame(gameloop);
})();
不要依赖于自动插入分号:规则过于复杂。
在你的情况下,编译器看到
... new Game()(something) ...
,它有没有足够的信息,不要以为something
是传递给函数new Game()
的参数。因此,错误...
明白了。错误与该函数的作用域有关。所以我需要有这个
(function gameloop() {
window.requestAnimationFrame(this.gameloop);
})();
即使它符合这个在Javascript中。
(function gameloop() {
window.requestAnimationFrame(gameloop);
})();
还请注意,目前在调用所述函数表达式中的命名函数表达式时存在问题,这可能会使代码在上面类似于代码。即下面的代码会给你即使有效的注释中显示的错误:
function a() {
var x = function b() {
b(); // <-- "**The name 'b' does not exist in the current scope**"
}
}
这是因为根据ECMAScript规范的section 13有效的,但目前失败。
我实际上有分号(复制和粘贴错误那里)。将你的代码复制到操场上。你会看到有错误(http://www.typescriptlang.org/Playground/) –
我没有看到错误...你的浏览器是什么? –
谷歌浏览器22 –