簡體   English   中英

有效JavaScript的TypeScript錯誤

[英]TypeScript error from valid JavaScript

以下代碼是有效的JavaScript,但在打字稿中會引發以下錯誤。 知道為什么嗎?

錯誤7名稱“ gameloop”在當前范圍中不存在

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

編輯:第一個答案后注意到與實際問題無關的復制和粘貼錯誤。

那只是一個缺少的分號,從而使其在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) ...

並且它沒有足夠的信息來不認為傳遞給函數new Game()的參數是something 因此錯誤...

得到它了。 錯誤與功能范圍有關。 所以我需要這個

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

即使它符合Javascript的要求。

(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);
            };
})();

我使用polyfill方法使requestAnimationFrame在chrome上工作,因為它是一種常見的解決方法。 polyfill本身可以用純TypeScript編寫,並帶有大量轉換,但是Javascript簡潔明了,您可以在Chrome刪除前綴時將其刪除,而不會影響您的TypeScript。

還要注意,當前在所述函數表達式中調用命名函數表達式存在一個問題,這可能會在類似於上面的代碼中咬住您。 即,以下代碼即使有效,也會給您注釋中顯示的錯誤:

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

根據ECMAScript規范的第13節這是有效的,但當前失敗。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM