Como impor regras de escopo restritas em JavaScript

Ao trabalhar com JavaScript nos formulários, é importante declarar objetos e variáveis dentro do escopo pretendido. A declaração global desnecessária de objetos ou variáveis pode causar problemas de desempenho. O escopo restrito foi introduzido no Designer 8.1 para aprimorar o tempo de execução e a utilização de memória de um formulário.

Qual é o escopo no JavaScript?

O escopo funciona exteriormente, permitindo que tudo que estiver entre chaves ({}) possa ver o que está fora delas. No entanto, o que está fora das chaves não pode acessar o que estiver dentro delas.

No exemplo a seguir, a primeira chave abre o escopo da função e a segunda o fecha. Tudo o que estiver entre chaves está dentro do escopo de foo ().

O escopo do exemplo a seguir é válido porque var nFooVar = nOutsideVar dentro das chaves pode ver var nOutsideVar = 2 fora das chaves.

Por outro lado, o exemplo a seguir mostra um escopo inválido, pois var nOutsideVar = nFooVar não pode acessar var nFooVar =4 dentro das chaves.

No script, o escopo descreve fragmentos de script que podem acessar fragmentos. Esses fragmentos de script podem ser variáveis ou funções.

Qual é o escopo de XML?

Em um design de formulário, o escopo se refere à hierarquia. Por exemplo, para acessar o subformulário dentro da seguinte fonte XML, você deve digitar outside.inside.

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

Você não digita inside.outside, pois primeiro deve acessar o subformulário externo e depois detalhar de fora para dentro.

Expressões SOM e escopo

Em formulários direcionados para o Acrobat ou Adobe Reader 8.1, as expressões SOM têm seu escopo definido corretamente, conforme demonstra este exemplo:

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

Em formulários direcionados para o Acrobat ou Adobe Reader 8.0, a expressão SOM a.b.a retorna o subformulário a. Em formulários direcionados para o Acrobat ou Adobe Reader 8.1, a expressão SOM a.b.a retorna null, pois o subformulário b não tem um filho com o nome a. No Acrobat ou Adobe Reader 9.0 ou posterior, a expressão retorna um erro, pois a não é um filho válido de b.

No Acrobat ou Adobe Reader 8.1, as funções e variáveis dentro do script de um nó não se tornam globais (exceto por objetos de script), como mostra este exemplo:

    <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> 

Ao clicar em field 2 em um formulário direcionado ao Acrobat ou Adobe Reader 8.0, a função bar() será executada.

Ao clicar em field 2 em um formulário direcionado ao Adobe ou Adobe Reader 8.1, a função bar() não será executada. Isso porque a função bar() está disponível somente dentro do script inicializado de field1.

Escopo e objetos de script

Os objetos de script têm um escopo global; portanto, todos os usuários podem acessá-los em qualquer lugar. Se há um método que você deseja que seja acessado por field1.initialize e field2.click, coloque-o em um objeto de script. O escopo restrito significa que você não pode chamar bar() de qualquer lugar de um formulário. Você também recebe um erro de tempo de execução, indicando que a função bar() não pôde ser resolvida. O mecanismo de script procurou bar() dentro do escopo ao qual você tem acesso e não a encontrou.

Escopo e versão de destino

Se você usa o escopo restrito, lembre-se de pode obter um melhor desempenho em formulários direcionados ao Acrobat ou Adobe Reader 8.1 e posterior. Evite usar o escopo restrito em formulários direcionados às versões mais antigas do Acrobat ou Adobe Reader. Caso contrário, os scripts dos formulários podem funcionar de maneira diferente. Para os formulários existentes, faça o backup antes de ativar o escopo restrito e sempre verifique o script depois. Quando você ativa o escopo restrito e depois altera a versão de destino para uma anterior ao Acrobat ou Adobe Reader 8.1, mensagens de aviso são exibidas.

Quando usar o escopo

Quando um formulário é direcionado ao Acrobat ou Adobe Reader 8.1 e o escopo restrito está ativo, as variáveis JavaScript declaradas são liberadas depois que cada script é executado. Quando um formulário é direcionado ao Acrobat ou Adobe Reader 9.0 e posterior, o escopo restrito não libera todas as variáveis JavaScript. A exceção é quando você reúne ou importa novos dados.

As melhorias de desempenho com as regras de escopo restrito se aplicam aos formulários direcionados ao Acrobat ou Adobe Reader 8.1 e posterior. Não aplique regras de escopo rígido para formulários direcionados para versões do Acrobat ou Adobe Reader anteriores à versão 8. Caso contrário, os scripts podem se comportar de forma diferente ou não funcionam.

Para ativar o escopo restrito

  1. Selecione Arquivo > Propriedades do Formulário e clique na guia Padrão.

  2. Selecione Reforçar regras de escopo restritas em JavaScript e clique em OK.