JavaScript での厳密なスコープ規則の強制

フォームで JavaScript を使用する場合、対象となるスコープ内でオブジェクトと変数を宣言することが重要です。不要にオブジェクトや変数をグローバルに宣言すると、パフォーマンス上の問題が生じることがあります。

厳密なスコープは、フォームの実行時のメモリ使用量を改善するために Designer 8.1 で導入されました。厳密なスコープは、Designer 10 では、新しいフォームに対してデフォルトで有効です。古いフォームに対しては、厳密なスコープを有効にするオプションが使用可能です。

JavaScript におけるスコープとは

スコープは、中括弧({})内のすべての要素が括弧の外部を参照できるように外側に機能します。ただし、中括弧の外部にある要素は中括弧内の要素にアクセスできません。

次の例では、最初の中括弧で関数のスコープを開始し、2 番目の括弧で関数のスコープを閉じています。中括弧内のすべての要素は、foo () のスコープ内にあります。

次の例のスコープは有効です。中括弧内の var nFooVar = nOutsideVar が中括弧外の var nOutsideVar = 2 を参照できます。

一方、次の例のスコープは無効です。var nOutsideVar = nFooVar は中括弧内の var nFooVar =4 にアクセスできません。

スクリプトにおけるスコープは、スクリプトの要素にアクセスできる要素を表します。スクリプトの要素には、変数または関数を使用できます。

スコープ XML とは

フォームデザインにおけるスコープとは階層のことです。例えば、次の XML ソースでサブフォーム inside にアクセスするには、「outside.inside」を入力する必要があります。

<subform name="outside"> 
    <subform name="inside"> 
    … 
    </subform> 
</subform>

inside.outside」は入力しません。最も外側のサブフォームから内側にアクセスする必要があるためです。

SOM 式とスコープ

Acrobat または Adobe Reader 8.1 を対象としたフォームでは、次の例に示すように SOM 式が正しくスコープされます。

    <subform name="a"> 
 
        <subform name="b"/>

Acrobat または Adobe Reader 8.0 を対象としたフォームでは、SOM 式 a.b.a はサブフォーム a を返します。Acrobat または Adobe Reader 8.1 を対象としたフォームでは、SOM 式 a.b.anull を返します。これは、サブフォーム ba a という子を持たないためです。 Acrobat または Adobe Reader 9.0 以降では、SOM 式はエラーを返します。これは、ab の有効な子ではないためです。

Acrobat または Adobe Reader 8.1 では、次の例に示すようにノードのスクリプト内の関数と変数はグローバルになりません(スクリプトオブジェクトは例外です)。

    <field name="field1"> 
    event activity="initialize"> 
 
            <script contentType="application/x-javascript"> 
 
            // Function bar() is scoped to field1.initialize; nothing outside <event activity="initialize"> scope can see inside here (in 8.1) 
 
            function bar() 
 
            { 
 
                return "bar"; 
 
            } 
 
        </script> 
 
    </event> 
 
    /field> 
 
    field name="field2"> 
 
        <event activity="click"> 
 
            <script contentType="application/x-javascript"> 
 
                field1.bar(); 
 
            </script> 
 
        </event> 
 
    </field> 

Acrobat または Adobe Reader 8.0 を対象としたフォームで field 2 をクリックすると、関数 bar() が実行されます。

Acrobat または Adobe Reader 8.1 を対象としたフォームで field 2 をクリックすると、関数 bar() は実行されません。これは、関数 bar() が、field1 の初期化されたスクリプト内からのみ使用できるためです。

スコープとスクリプトオブジェクト

スクリプトオブジェクトにはグローバルスコープがあるので、すべてのユーザーがどこからでもアクセスできます。field1.initialize および field2.click の両方からアクセスするメソッドは、スクリプトオブジェクトに配置します。厳密なスコープでは、bar() をフォーム内のどこからも呼び出ません。また、関数 bar() を解決できなかったことを示す実行時エラーが表示されます。スクリプトエンジンでは、ユーザーがアクセスできるスコープ内で bar() を探しましたが、見つかりませんでした。

スコープと対象バージョン

厳密なスコープを使用すると、Acrobat または Adobe Reader 8.1 以降を対象としたフォームではパフォーマンスが向上します。Acrobat または Adobe Reader の以前のバージョンを対象としたフォームでは厳密なスコープを使用しないでください。使用すると、フォーム内のスクリプトが予期しない動作をすることがあります。既存のフォームの場合は、厳密なスコープを有効にする前にフォームをバックアップして、常にスクリプトを後で確認してください。厳密なスコープを有効にした後で、対象バージョンを Acrobat または Adobe Reader 8.1 より前のバージョンに変更すると、警告メッセージが表示されます。

いつスコープを使用するか

フォームが Acrobat または Adobe Reader 8.1 を対象にしていて、厳密なスコープが有効である場合は、各スクリプトが実行された後で、宣言されている JavaScript 変数が解放されます。フォームが Acrobat または Adobe Reader 9.0 以降を対象としている場合は、厳密なスコープによりすべての JavaScript 変数が解放されるとは限りません。新しいデータの再結合または読み込みを行う場合は例外です。

厳密なスコープによるパフォーマンスの向上は、Acrobat または Adobe Reader 8.1 以降向けのフォームに適用されます。Acrobat または Adobe Reader 8 より前のバージョン向けのフォームでは、厳密なスコープを適用しないでください。使用すると、スクリプトが予期せぬ動作をしたり、動作しない場合があります。

厳密なスコープを有効にするには

  1. ファイル/フォームのプロパティを選択し、「実行時」タブをクリックします。

  2. オプションが使用可能な場合は、「JavaScript で厳密なスコープ規則を強制」を選択し、「OK」をクリックします。

    注意: 「実行時」タブで、厳密なスコープ規則を強制するオプションが使用できない場合は、厳密なスコープが既に有効になっています。