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

Google Closure Compiler incorrectly removes function call

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

我 运行 遇到了一个问题,我似乎无法摧毁精灵。检查编译器的输出后,我注意到它一直在删除我的 destroy 函数调用。

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

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

它被编译成这样:

"undefined"!=typeof this.sprite&&(console.log("destroy sprite"),console.log("sprite destroyed"))

我不明白为什么删除了代码,Phaser 被设置为外部,我没有 运行 使用任何其他方法或移相器解决这个问题 类。

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

更新

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

更新 2

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

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

编译器认为this.sprite.destroy()没有副作用。这就是问题所在。如果你能 post destroy 函数的来源,我会更新这个答案。

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

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

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

Javascript: http://pastebin.com/A4w2YG9N

所以出于某种原因,出于某种原因在随机 class 中定义一个名为 destroy 的方法会破坏一切。尽管未使用 class,并且方法为空。

更新

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

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

var Phaser = {};
 
Phaser.Sprite = function(game, x, y, key, frame){};
 
Phaser.Sprite.prototype.destroy = function(){};