Utilizar funções para inicializar e tomar decisões JavaScript

Utilizar funções para inicializar e tomar decisões Problema Você deseja usar funções para inicializar e tomar decisões. Teoria Normalmente, quando você escreve um pedaço de código onde uma mudança de lógica tem de ter lugar com base em um contexto, você usa uma estrutura de decisão. Por exemplo, digamos que está a implementar um interruptor de luz usando um programa. Você acender a luz se a luz está desligada, e você desligar a luz se a luz está acesa. O comportamento do programa é determinada pelas condições. Comportamento Um exemplo que merece um olhar mais atento é a inicialização. Inicialização normalmente deve acontecer somente se não tem já. A inicialização é importante porque a lógica de inicialização cria o quadro padrão para seu aplicativo para funcionar corretamente. Solução Para fins ilustrativos, vamos passar um exemplo em que uma função requer uma inicialização que está embutido dentro da função. A lógica é realizar uma inicialização, se não tiver já ocorrido. A função que é chamado é definido como se segue, e que incorpora uma chamada para a inicialização.

  

Dica Você poderia usar esse tipo de código para implementar uma inicialização lenta ao escrever código baseado em convenção que não executar uma inicialização explícita.

 Fonte: / website / ROOT / ajaxrecipes / javascript / makingdecisionsinitialization.html função ClassicalManipulateObject (obj) (info ( "ClassicalManipulateObject", "Starting"); if (! didInitialize) ( DoInitialization (obj); ) else ( info ( "ClassicalManipulateObject", "não inicialização necessário"); )assertEquals (3 obj.value); info ( "ClassicalManipulateObject", "Fim");)

 

No exemplo, o código em negrito refere-se a funcionalidade de inicialização. didInitialize é uma variável de sinalizador que pode ser verdadeiro ou falso. Se o didInitialize variável é falsa, então a inicialização não ocorreu, se o didInitialize variável é verdadeira, então a inicialização teve lugar. Se a inicialização não teve lugar, a função DoInitialization é chamado. Observe que a lógica é uma variável que representa se a inicialização tenha tido lugar e uma função para fazer a inicialização. Este código é problemática porque a variável deve ser definido em algum lugar, e a variável tem de ser atribuído corretamente em algum lugar. E em algum lugar existe uma referência cruzada entre as variáveis de estado e da vocação da funcionalidade de inicialização. Uma solução é inserir grande parte da lógica de inicialização no contexto da função DoInitialization. Mas o fato é que em algum lugar existe uma variável, e em algum lugar existe uma função de inicialização, e em algum lugar existe uma referência cruzada entre a variável ea função de inicialização. Então, onde você coloca a lógica é irrelevante, uma "grande figura" sentido.

Outra solução é não pensar da funcionalidade de inicialização como uma decisão, mas como um estado. Existe um estado inicial, que é realizar uma inicialização, e um outro estado a não realizar a inicialização. Em certo sentido, o didInitialize variável é uma representação do estado. Mantendo esse pensamento em mente, você sabe que o JavaScript trata suas funções como objetos. Assim, o didInitialize variável pode ser uma função e não uma variável booleana. Tratar o estado como uma variável que referencia uma função que permite simplificar a função que requer uma inicialização. A implementação da função ClassicalManipulateObject é alterado para ManipulateObject, como ilustrado no código a seguir.

 Fonte: / website / ROOT / ajaxrecipes / javascript / makingdecisionsinitialization.html função ManipulateObject (obj) (info ( "ManipulateObject", "Starting"); InitializeObject (obj);assertEquals (3 obj.value); info ( "ManipulateObject", "Fim");)

Na execução modificado, o novo código em negrito representa a funcionalidade de inicialização. Aqui não há uma decisão apenas a uma chamada de função para InitializeObject. Você pode estar pensando: "Eu poderia ter feito a mesma coisa com a decisão de inicialização baseado, em que a decisão seja implementada no InitializeObject." Mas isso é incorreto, pois na execução do InitializeObject, não há nenhuma decisão. A implementação de InitializeObject inicializa a variável e depois permite que o processamento continue. Se não houver uma decisão sobre se a inicialização ocorreu, e InitializeObject representa uma função para inicializar o estado, em seguida, para cada chamada o Estado será inicializado você não pode chamar essa funcionalidade de inicialização. A magia está no fato de que trata o JavaScript funciona como objetos. A implementação de InitializeObject é a seguinte:

função InitializeObject (obj) (obj.value = 3; info ( "InitializeObject", "fazer a inicialização); InitializeObject = InitializeEmptyObject;)

Na execução do InitializeObject, o parâmetro obj é inicializado para um valor de 3, bem como o código em negrito mostra a mudança da função InitializeObject. O reatribuída referências InitializeObject uma função sem corpo, o que significa que pela primeira vez InitializeObject é chamado, a inicialização é realizada, mas depois de cada chamada é uma chamada de função vazia que não faz nada.

Esta é a implementação completa da funcionalidade de inicialização sem o uso de uma única decisão ou variável. Uma vantagem dessa abordagem é que você não precisa saber qual variável de referência cruzada com a função. A função cuida de si mesmo, eo chamador pode continuar chamando InitializeObject, sabendo que tudo será cuidado. Outra vantagem dessa abordagem é que você está criando um motor de estado onde o próximo estado é determinado pela execução do estado atual . Não há uma localização central, bloquear a decisão que determina o fluxo global de execução e precisa ser atualizado toda vez que um novo estado tem de ser integrado. Normalmente quando escrever código em uma linguagem como Java, C # ou C + +, você não precisa ir ao redor de reafectação a execução da função definida. E porque este comportamento é arraigado nas mentes dos programadores, nem sequer considerar fazer isso. Ainda não há absolutamente nenhum problema reafectação de funções em JavaScript, porque as funções são objetos. Funções não são identificadores únicos com funcionalidades exclusivas, como você pensa deles quando estiver trabalhando com eles em outras línguas.

A implementação de InitializeObject funciona e é uma solução completa. Mas há um pequeno inconveniente em que, uma vez InitializeObject foi atribuído a uma função vazia, a funcionalidade de inicialização está perdido até que a página HTML é atualizada. Para alguns problemas, que é uma solução aceitável. Por exemplo, você embrulhar XMLHttpRequest apenas uma vez, porque você pode criar uma instância XMLHttpRequest em apenas um navegador certa maneira específica. Existem alguns casos, no entanto, quando você pode desejar para redefinir e inicializar novamente, e ser capaz de fazer isso, você precisa de embrulhar InitializeObject em uma função dentro de uma função, como demonstrado no exemplo a seguir.

 Fonte: / website / ROOT / ajaxrecipes / javascript / makingdecisionsinitialization.html função ResetInitializeObject () (InitializeObject = function (obj) (obj.value = 3; info ( "InitializeObject", "fazer a inicialização); InitializeObject = InitializeEmptyObject;)) ResetInitializeObject ( );

A função InitializeObject é uma variável que é atribuída uma função implementação no contexto ResetInitializeObject. Receita 2-4 mostra que não há diferença no modo como uma função é declarada, mesmo que pareça estranho ou fora do lugar. Para inicializar InitializeObject, a função ResetInitializeObject é chamado, criando, assim, a função InitializeObject. InitializeObject E quando chamado a se transferir para uma função vazia.

Chamando ResetInitializeObject novamente redefine a inicialização, permitindo InitializeObject para inicializar o estado e reiniciar-se novamente. Partir deste exemplo, você pode ver que a decisão não precisa ser implementado usando uma instrução if. Outro exemplo que ilustra como um motor de Estado poderiam ser implementadas a seguir. O exemplo implementa um interruptor de luz, onde se a luz está acesa, ela é desligada, e vice-versa. Note que nem uma única instrução if é usado neste exemplo.

 Fonte: / website / ROOT / ajaxrecipes / javascript / makingdecisionsinitialization.html função ToggleLight () (ToggleLight.on = function () (ToggleLight.curr = ToggleLight.off; retornar "on";) ToggleLight.off = function () (ToggleLight.curr = ToggleLight.on; retorno "off";) try (return ToggleLight.curr ();) catch (e) (info ( "ToggleLight", "inicialização ToggleLight.on ..."); return ();))

O ToggleLight função é chamada sempre que quiser mudar a luz ligada ou desligada. Não existe um parâmetro para indicar um ou em um off; que a funcionalidade está incorporada dentro da função ToogleLight. Na execução ToggleLight há duas propriedades, dentro e fora, sendo que ambos são funções. A sobre a função atribui a propriedade curr para fora e retorna um "on" buffer. A função de desligar atribui a propriedade curr para fora e retorna um "off-tampão".

Para alternar o estado, a propriedade curr que é definido como uma função é chamada. A convocação de curr é incorporado em um bloco de exceção, porque curr não será inicializado o ToggleLight primeira vez é chamado. Assim, é gerada uma exceção, e na parte de captura do bloco de exceção, o da propriedade (que é uma função) é chamado. Calling on atribui automaticamente curr e inicializa o estado. É importante lembrar que o uso de um bloco de exceção e convidando é aceitável, porque é uma forma de implementar a inicialização lenta. Ao escrever os blocos e funções de decisão, pense sobre o estado e os seguintes aspectos desta receita:

• Seu programa não precisa de incluir, como muitas decisões, porque as decisões foram substituídos pelos diferentes estados.

• Você pode transferir funções se você pode quebrar o problema em um problema no motor do estado.

• Você pode ser mais flexível com as funções transferido porque o comportamento pode ser substituído dinamicamente. Por exemplo, se você precisar de um estágio de dois a inicialização usando uma decisão, que meios adicionais, se as declarações alteradas em um local central do código fonte. Usando uma função transferido, você está criando um motor de estado onde o comportamento pode ser alterado durante a execução a nível local.

• Quando você lê através de exemplos desta receita, você pode ter pensado: "Por que não usar uma classe e objeto?" A resposta é que uma função é um objeto e os exemplos são programação orientada a objeto. O código é estranho porque normalmente assumem uma função é um recurso utilizado para criar uma classe, e que as aulas normalmente não são funções. Se a notação incomoda você, meu conselho é deixar essa característica de guisado JavaScript em sua mente um pouco. Você certamente vai entrar para ver que é uma forma poderosa de programação.

Nota Para outro exemplo do uso de recursão em vez de utilizar blocos de decisão.

um artigo submetido por Sonja Lande


Isenção de responsabilidade:O nosso site não se responsabiliza pelo conteúdo deste artigo. Webarticles é uma fonte de informação livre.
Importante: Este artigo "Usando funções para inicializar e tomar decisões JavaScript" foi traduzida por um software automático. Nós sentimos muito por quaisquer erros de ortografia que pode ter ocorrido. Obrigado pela sua compreensão.


Online: 331 users browsing the articles directory