2012-10-21 38 views
1

以下代码是有效的JavaScript,但在打字稿中会引发以下错误。任何想法为什么?来自有效JavaScript的TypeScript错误

错误7名“gameloop”不当前范围存在

(function gameloop() { 
    window.requestAnimationFrame(gameloop); 
})(); 

编辑:后第一个答案注意到,是不相关的实际问题,复制和粘贴错误。

回答

3

我也运行到这一点,但它需要不同的修补程序。就我而言,我使用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时,你可以删除它。

4

这只是一个缺少的分号,无法在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()的参数。因此,错误...

+0

我实际上有分号(复制和粘贴错误那里)。将你的代码复制到操场上。你会看到有错误(http://www.typescriptlang.org/Playground/) –

+0

我没有看到错误...你的浏览器是什么? –

+0

谷歌浏览器22 –

4

明白了。错误与该函数的作用域有关。所以我需要有这个

(function gameloop() { 
window.requestAnimationFrame(this.gameloop); 
})(); 

即使它符合这个在Javascript中。

(function gameloop() { 
window.requestAnimationFrame(gameloop); 
})(); 
1

还请注意,目前在调用所述函数表达式中的命名函数表达式时存在问题,这可能会使代码在上面类似于代码。即下面的代码会给你即使有效的注释中显示的错误:

function a() { 
    var x = function b() { 
     b(); // <-- "**The name 'b' does not exist in the current scope**" 
    } 
} 

这是因为根据ECMAScript规范的section 13有效的,但目前失败。