私は、いくつかのJavascriptファイルを1つに統合し、それらを条件付きで適用しようとしている状況があります。私は実際のファイルを変更したくありません。これらのファイルをラップしてオンデマンドで呼び出す方法はありますか?入れ子関数をJavascriptのグローバルスコープに配置できますか?
これらのファイルの中には、関数xyz(){}が含まれているものがあります。だから、if(false){function xyz(){}}でそれらをラップすると、悪いことが起こります。例えば
、これは私のコードであれば...
if (includeFile) {
/* The file */
function foo() {}
/* The file */
}
問題はクロームがfoo()を参照してくださいとグローバルスコープeven if includeFile is falseに配置されることになります。
簡単な解決策はvar foo = function(){}に変更することですが、これらのファイルを変更することはできません。
私はまた、これらの関数がかなり大きいので、eval()を実行することについて一般的に懸念しています。 (関数内にjQueryが入っていると思っていますが、問題がなければevalは答えでしょうか?)
関数をネストしてスコープとしてウィンドウを渡すことができましたが、tried it on jsFiddle and it didn't seem to workです。
(function() {
function foo() {
alert('it works');
}
}).apply(window, []);
foo();
questionssimilarいくつかあります。しかし、誰も私が持っているのと同じ状況に対処していません。ありがとう。
したがって、問題は、複数のファイル間で名前の衝突があることです - 複数の関数xyz?それらを本当に悪いものに変更していますか?エラーを導入すること、または上流に適合することを心配していますか?あなたは機械的に名前を変更できますか?どういうわけかsedまたは細分化ツールで? – Rup
私は、縮小ツールやマクロプリプロセッサのラインに沿って考えています。あなたは何人の 'xyz'を扱わなければなりませんか?そして、その一部だけが特定のページ上で実行される場合、すべてのものを1つのファイルに入れるのは実際には最良のアイデアですか? –
まあ、考え方は、ページやコンテキストによっては、あまりにも多くのファイルが読み込まれているということです。どこかに約100のさまざまなリソース(CSSや画像を含む)。したがって、この数字を減らすために、私たちは頻繁に使用されるいくつかのファイルを結合しようとしています。この場合、いくつかはライブラリであり、いくつかは社内コードです。 これまでは、関数xyz(){}をグローバルスコープに配置することについて心配していませんでした。新しい結合ファイルで、if(false){function xyz(){}}がグローバルスコープで終わるので、それをvar foo = function(){function xyz(){}}にラップしているとわかりました。 if(false){foo(); } –