JavaScriptしっかり書くならグローバル変数は極力なくして、どうしてもグローバル変数が必要なときはできるだけ独特な名前を、となるのでしょうけど、まぁInDesignやイラレでちょっとしたスクリプト書くときに、いちいちそんなこと気にしたくありません。適当な変数名で、グローバルスコープにベタ書きしてしまいがちです。
しかしそういうとき、適当につけた変数名が思わぬバグを引き起こすことがあります。たとえばファイルパスの変数名に
pathとか、何かを反転する関数名に
reflectとか、つい使ってしまいそうですけど、これらはバグの元です。(関数の中のローカル変数で使うのは問題ありません)
この手のバグ、知識として知っとかないと原因の特定がすごく難しいので、この際まとめておきます。
ExtendScriptはJavaScriptの亜種なので、JavaScriptでグローバル変数名に使っちゃダメなもの、たとえばeval、alert等の組み込み関数の名前や予約語等は、もちろんExtendScriptでもダメです。
ここでは「普通のJavaScriptならOKだけどExtendScriptではダメなもの」を紹介します。
ただし、ExtendScript全体で共通のものと、InDesign・イラレ独自のものだけです。フォトショやAEにも独自のものがあると思いますが詳しくないので触れません。
1.アプリケーションオブジェクト
のことですね。当たり前ですが一応挙げておきます。
2.ExtendScript独自の組み込み関数名
ExtendScript共通のものとしてはXML絡みの
- isXMLName
- setDefaultXMLNamespace
くらいしかないです。
アプリケーション独自のものには
- exit(InDesignのみ)
- resolve(InDesignのみ)
などがあります。
3.各種コンストラクタ名
ExtendScript共通のものはUnitValue、Reflection、BridgeTalkなど、
アプリケーション独自のものはDocument、PageItem、TextFrameなど膨大にありますが、
最初が大文字の変数名を避ければいいので、ここでは列挙しないことにします。
4.Object.prototypeのプロパティ名
Object.prototypeのプロパティというのは、すべてのオブジェクトが共通して持っているプロパティのことです。
すべてのオブジェクトが持つということは、グローバルオブジェクトも持っています。
そしてグローバル変数というのはグローバルオブジェクトのプロパティでもあります。
したがって、グローバル変数で「Object.prototypeのプロパティ名」を使おうとすると、グローバルオブジェクトがもともと持っているプロパティと競合してしまうので使ってはいけません。
ExtendScriptにあり、今のJavaScriptにはないものとして
が挙げられます。
(watch、unwatchは昔のJavaScriptにはあったらしい)
5.appのプロパティ名(イラレ、フォトショのみ)
イラレスクリプトでは、なぜかapp.が省略できます。
スクリプトの書き出しは、
var doc=app.activeDocument;
みたいなので始まることが多いですが、これを
var doc=activeDocument;
と書いても動くのです。
この謎仕様により、イラレスクリプトではappの持つプロパティ名をグローバル変数名に使えません。
appのプロパティ一覧(CS6)はこちら
http://jongware.mit.edu/iljscs6html/iljscs6/pc_Application.html
うっかり使ってしまいそうなものとしては、
などがあります。
※Photoshopでも同じ問題があるようです。(
お~まちさんに教えていただきました)
(ちなみに似たような謎仕様として、textRange.characterAttributes の characterAttributes も省略できます)
オワリ
PR