以下のコードは有効なJavaScriptですが、typescriptでは次のエラーがスローされます。なぜですか?
エラー7「gameloop」という名前は現在のスコープに存在しません
(function gameloop() {
window.requestAnimationFrame(gameloop);
})();
編集:最初の回答の後、実際の問題とは関係のないコピーアンドペーストエラーに気づきました。
以下のコードは有効なJavaScriptですが、typescriptでは次のエラーがスローされます。なぜですか?
エラー7「gameloop」という名前は現在のスコープに存在しません
(function gameloop() {
window.requestAnimationFrame(gameloop);
})();
編集:最初の回答の後、実際の問題とは関係のないコピーアンドペーストエラーに気づきました。
とった。エラーは関数のスコープに関係していました。だから私はこれを持っている必要があります
(function gameloop() {
window.requestAnimationFrame(this.gameloop);
})();
Javascriptではこれに準拠していますが。
(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) ...
something
そして、それが関数に渡された引数であると思わないための十分な情報がありませんでしたnew Game()
。したがって、エラー...
私もこれに遭遇しましたが、別の修正が必要でした。私の場合、TypeScriptのwindow.requestAnimationFrameを使用してから、Chromeでコードを実行していました。ただし、「ウィンドウにrequestAnimationFrameがありません」というランタイムエラーが発生しました。これは、ChromeではrequestAnimationFrameのプレフィックスがまだ付いているためです。TypeScript宣言に接頭辞付きの宣言を追加するか、標準的な方法でwindow.requestAnimationFrameをplolyfillsするJavaScriptファイルをプロジェクトに追加する必要があります。
// 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で機能させるようにしました。これは、このような一般的な修正であるためです。ポリフィル自体は、大量のキャストを使用して純粋なTypeScriptで記述できますが、Javascriptはクリーンで簡単であり、ChromeがTypeScriptに影響を与えることなくプレフィックスを削除するときに削除できます。
また、現在、上記の関数式内で名前付き関数式を呼び出す際に問題が発生していることにも注意してください。これにより、上記と同様のコードが使用される可能性があります。つまり、以下のコードは、有効であってもコメントに示されているエラーを表示します。
function a() {
var x = function b() {
b(); // <-- "**The name 'b' does not exist in the current scope**"
}
}
これはECMAScript仕様のセクション13に従って有効ですが、現在は失敗します。