現在、私のGWT(バージョン2.5.1)アプリケーションでFirefox 46以降に発生するいくつかの奇妙なエラーをデバッグしています。GWTによって生成されたjavascriptコードには、このパターンの複数のインスタンスが含まれています:javacriptの関数宣言の再割り当て
function nullMethod() {
}
var v;
function f() {
f = nullMethod;
v = { name : 'Joe' };
console.log("called");
}
// this is called from multiple places
console.log((f(), v).name);
console.log((f(), v).name);
console.log((f(), v).name);
これは何とかシングルトンパターンを実装しているようです。しかし、何らかの理由でこれが初期の宣言されたメソッドが再び呼び出されることを妨げるものではありません。 'called'という文字列がコンソールに複数回出力されます。
しかし、私は少しテストでこれを再現しようとすると、すべて期待どおりに動作します。上記からの観測は、生成されたコード(> 5MB)にコンソール出力を追加することによって行われました。
今、本当に奇妙なものです。関数の最初の文として "console.log(f.toString())"を追加すると、最初の呼び出しで初期関数が出力されます。それ以降のすべての呼び出しはnullMethodを出力します。
誰かが何が原因なのか説明できますか? IE11は正常に動作します。 ChromeはFirefox 46と同じ問題を抱えています。この動作が導入されて以来、私は古いChromeバージョンを確認することができませんでした。このように宣言された関数を上書きすることは有効ですか?
jsbin.comは、機能の再割り当てライン上の警告が得られる:この場合
Line 6: 'f' is a function.
ありがとうございます!今私は、私が取り組んでいるいくつかのプロジェクトを検証しなければならないことを知っています。 –
GWT 2.5.1が影響を受けることは知っています。私はネット上でこの問題に関するさらなる情報を見つけられませんでした。シンプルなデモアプリケーションを使用して、さまざまなGWTバージョンでこの問題を再現しました。しかし、コンパイラが常に欠陥のあるコードを発行するとは限りません。アプリケーションを新しいGWTバージョンにアップグレードすることは、いくつかの依存関係があるため簡単ではありません。影響を受けるGWTのバージョンのリストがありますか? @DanielK。 –
コンパイラだけではなく、具体的にはリンカです。最新のgwtで壊れたリンカを使用することも、gwt 2.0上で動作するリンカを使用することもできます。これで、GWT 2.5.1のすべての_built-in_リンカのソースをすばやく見直しましたが、すべての関数のtry/catchラッパーを発行していないようですので、カスタムリンカーを使用するか、 GWTの一部になる –