結論
グローバル変数、Apex変数などをjavascript(以降js)に埋め込んで処理したい時(コンポーネントのidなど)に、jsが静的リソースにあるとページがレンダリングされた時にグローバル変数は展開されずに、ただの文字列としてレンダリングされます
つまり、静的リソース内のjsでグローバル変数を扱えない
理由
Visualforceページは動的ページで、ページがレンダリングされる時にグローバル変数、Apex変数などはブラウザが解釈できるHTMLタグに変換される
なので、Visualforce外のJavaScript内(静的リソースのjs)に含まれているApex変数やグローバル変数は展開されずに、そのまま文字列としてページにレンダリングされます
対策方法
1. グローバル変数の外だし
visualforceでしかグローバル変数やApex変数を展開できないので、静的リソースを読み込む前にjsの変数にグローバル変数を代入する
visualforce.page
<script>
var componentFormId = "{!$Component.form.xxx}";
</script>
<script src="静的リソースのhogehoge.js"></script>
静的リソース内のjsでは上記のcomponentFormId
変数ありきで実装する
hogehoge.js
document.getElementById(componentFormId).value;
2. visualforceにjavascriptをまとめる
- 静的リソースを使わずにvisualforceにjavascriptをまとめる
- visualforceのincludeを使って、javascriptのみが書かれたvisualforceを読み込む(静的リソースのような使い方)