Google Closure Compiler错误地删除了函数调用

时间:2015-08-13 11:31:20

标签: javascript typescript google-closure-compiler phaser-framework

我正在开发一款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 extern文件。专门针对此问题创建一个修复它,但是如果没有完整文件,则总会有更多问题发生。

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

2 个答案:

答案 0 :(得分:2)

我已经弄明白是什么造成了这种情况,但是为什么它会导致它我不知道如果有人有线索我非常感兴趣。

以下示例允许您重现我的问题:

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

Javascript:http://pastebin.com/A4w2YG9N

因此出于某种原因,出于某种原因在随机类中定义一个名为destroy的方法会破坏所有内容。即使没有使用该类,该方法也是空的。

<强>更新

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

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

答案 1 :(得分:0)

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