Google Closure 编译器错误地删除了函数调用

Kok*_*kos 5 javascript google-closure-compiler typescript phaser-framework

我正在开发一个 HTML5 游戏,在高级模式下使用 Phaser 和 Google Closure 编译器来打包游戏。

我遇到了一个问题,似乎我无法销毁精灵。检查编译器的输出后,我注意到它不断删除我的销毁函数调用。

我的代码很简单,我已经测试了以下内容:

sprite.destroy();Phaser.Component.Destroy.prototype.destroy.call(sprite);

这两行都只是从我的代码库中删除。这并不是因为它是无法访问的代码,如果我将console.log语句放在相同的范围内,它们就会保留在那里。

所以原来的代码是这样的:

if (typeof this.sprite != 'undefined'){
    console.log('destroy sprite');
    this.sprite.destroy();
    Phaser.Component.Destroy.prototype.destroy.call(this.sprite);
    console.log('sprite destroyed');
}
Run Code Online (Sandbox Code Playgroud)

它被编译为:

"undefined"!=typeof this.sprite&&(console.log("destroy sprite"),console.log("sprite destroyed"))
Run Code Online (Sandbox Code Playgroud)

我不明白为什么代码被删除,Phaser 设置为外部,并且我没有使用任何其他方法或 Phaser 类遇到此问题。

顺便说一下,简单地调用eval('this.sprite.destroy();');就可以了。这证明该函数确实存在。然而,这是一个非常糟糕的解决方案,并且只有在编译器在这种情况下没有替换时才有效sprite

更新

我已经能够用很少的代码可靠地重现该问题,请参阅下面的答案。但我还不知道为什么会发生这种情况。

更新2

感谢 Hacketo,我们发现出现此问题是因为缺少正确的 Phaser 外部文件。专门针对此问题创建一个文件可以修复它,但是如果没有完整的文件,总会有可能出现更多问题。

对于这个特定问题,添加以下文件作为 extern 修复了它:http ://pastebin.com/nXA0fiZr

Kok*_*kos 2

我已经弄清楚了造成这种情况的原因,但是我不知道为什么会造成这种情况,所以如果有人有线索,我很感兴趣。

这是一个示例,可让您重现我的问题:

打字稿: http: //pastebin.com/YaCfH2mz

JavaScript: http: //pastebin.com/A4w2YG9N

destroy因此,由于某种原因,定义一个在随机类中调用的方法会破坏一切。即使没有使用该类,并且该方法是空的。

更新

感谢 Hacketo,我们发现出现此问题是因为缺少正确的 Phaser 外部文件。专门针对此问题创建一个文件可以修复它,但是如果没有完整的文件,总会有可能出现更多问题。

对于这个特定问题,添加以下文件作为 extern 修复了该问题:

var Phaser = {};
 
Phaser.Sprite = function(game, x, y, key, frame){};
 
Phaser.Sprite.prototype.destroy = function(){};
Run Code Online (Sandbox Code Playgroud)