JavaScripot Funções

Tratar Funções como objetos

  

Problema Você quer tirar proveito do fato de que funções são objetos (lembre-se, tudo é um objeto em JavaScript). Teoria Muitas pessoas pensam que é uma função de algumas palavras-chave utilizadas em JavaScript. A função também é um objeto que pode ser manipulado. Sabendo que uma função é um objeto faz com que seja muito interessante do ponto de vista de escrever código em JavaScript, pois o código pode tratar a função como um outro de outro objeto. Isto significa que você pode atribuir funções de variáveis, propriedades de classe, e que o têm. Solução Uma maneira de utilizar esta capacidade é para implementar o padrão Factory para retornar um objeto função. Por exemplo, em Ajax você tem duas maneiras de instanciar o objeto XMLHttpRequest, eo método utilizado depende do navegador.

O padrão de fábrica é usado para separar a interface da aplicação. Geralmente isso significa implementar uma interface, mas porque JavaScript é uma linguagem dinâmica, não existe uma noção real de uma interface. Em uma linguagem dinâmica, uma interface não é necessária, porque você pode chamar um método diretamente sem a necessidade de um tipo específico. No caso de a instanciação objeto XMLHttpRequest, o padrão Factory retorna uma referência de funções que podem ser utilizados para instanciar XMLHttpRequest usando a técnica apropriada . Em JavaScript, uma função é um objeto que pode ser atribuído a uma variável. Uma maneira de implementar a fábrica que instancia XMLHttpRequest é usar as atribuições da função. A implementação completa é a seguinte.

 Fonte: / website / ROOT / ajaxrecipes / javascript / functionsareobjects.html função InstantiateIEXMLHttpRequest () (return new ActiveXObject ( "Microsoft.XMLHTTP");) function InstantiateOthersXMLHttpRequest () (return new XMLHttpRequest ();) function FactoryXMLHttpRequest () (if (window. XMLHttpRequest) (return InstantiateOthersXMLHttpRequest;) else if (window.ActiveXObject) (return InstantiateIEXMLHttpRequest;) throw new Error ( "Could not instantiate XMLHttpRequest");)

No exemplo anterior, a função FactoryXMLHttpRequest é a implementação do padrão Factory. No âmbito da implementação de função são duas afirmações que se verificar qual o browser está sendo executado. Dependendo do browser, a instrução de retorno irá retornar uma referência, quer a função InstantiateIEXMLHttpRequest ou a função InstantiateOthersXMLHttpRequest. Em ambos os casos, a referência retornada é uma função que irá criar o objeto XMLHttpRequest. O código que usa o método FactoryXMLHttpRequest segue.

 Fonte: / website / ROOT / ajaxrecipes / javascript / factory_function functionsareobjects.html: function () (var InstantiateXMLHttpRequest = FactoryXMLHttpRequest (); var xmlhttp = InstantiateXMLHttpRequest (); assertNotNull (xmlhttp);)

Repare no exemplo de como a variável InstantiateXMLHttpRequest pode ser tratada como uma função. Para fins ilustrativos, a variável InstantiateXMLHttpRequest usa uma mistura de letras maiúsculas e minúsculas para ilustrar que, quando a variável é chamada, ela se parece com uma chamada de função. Baseado no identificador e do contexto em que a variável é usada como uma função, você não saberia que a variável não é uma função.

Este é um ponto muito importante, porque mostra que uma função é apenas outro objeto. FactoryXMLHttpRequest é codificada utilizando uma abordagem tradicional: o código declara uma função que, quando chamado vai retornar um exemplo de uma função. O comportamento do código é determinado após o código tiver sido analisado e inicializado. Com JavaScript, isso não é necessário, porque você pode iniciar as funções quando o código está sendo analisado para otimizá-lo. Por exemplo, você poderia reescrever o código FactoryXMLHttpRequest como se segue.

 Fonte: / website / ROOT / ajaxrecipes / javascript / functionsareobjects.html 

Na implementação vez, o código usado para atribuir a variável InstantiateXMLHttpRequest é executado como a página HTML é carregada. Assim, sempre que a variável InstantiateXMLHttpRequest é referenciada como uma função, a forma adequada de instanciar XMLHttpRequest é executado. Não há necessidade de chamar uma fábrica e tome uma decisão cada vez que a função é chamado. Essa capacidade de tratar as funções como objetos acrescenta uma faceta interessante de codificação, em que o comportamento do código pode ser determinado em tempo de execução. Onde normalmente você usaria uma estrutura de decisão para determinar o comportamento apropriado, uma variável dinamicamente atribuído pode ser utilizado. Porque uma função é um objeto, existem algumas possibilidades adicionais de codificação. Por exemplo, é possível atribuir dinamicamente as propriedades e métodos para uma função, como mostra o exemplo a seguir.

 Fonte: / website / ROOT / ajaxrecipes / javascript / functionsareobjects.html função FunctionFunctionProperties (cmpval) (assertEquals (cmpval, FunctionFunctionProperties.value);) var VariableFunctionProperties = function (cmpval) (assertEquals (cmpval, VariableFunctionProperties.value);) startIndex var = VariableFunctionProperties . toString () indexOf. (endIndex "{"); var = VariableFunctionProperties.toString () lastIndexOf. (buffer "}"); var = VariableFunctionProperties.toString () fatia. (startIndex + 1, endIndex); InstantiatedFunctionProperties var = new Function ( "cmpval", buffer);

Este exemplo mostra três declarações de função, com cada declaração ilustra uma maneira diferente de declarar uma instância da função. A primeira declaração, FunctionFunctionProperties, é a abordagem tradicional. A segunda declaração, VariableFunctionProperties, usa uma variável e uma função anônima. E a terceira declaração, InstantiatedFunctionProperties, é uma instanciação explícita do objeto de função, onde os parâmetros do construtor representar a declaração dos parâmetros, eo último parâmetro é o corpo da função.

O corpo da função é um buffer de código JavaScript que é convertido em JavaScript executável. Para cada uma das três implementações de função, o nome da função é referenciada e adicionados com uma referência ao valor da propriedade. Com cada instância função que você pode atribuir uma propriedade, ou, se assim o desejarem, a referência a outra função. Você pode pensar em imóveis como uma forma de declarar uma variável estática que está associado com a função. Porque cada uma das três declarações de função representa um objeto e uma variável, que pode ser chamado de um modo idêntico, como ilustrado no exemplo a seguir.

 Fonte: / website / ROOT / ajaxrecipes / javascript / function_with_properties functionsareobjects.html: function () (VariableFunctionProperties.value = 10; VariableFunctionProperties (10); FunctionFunctionProperties.value = 10; FunctionFunctionProperties (10); InstantiatedFunctionProperties.value = 10; InstantiatedFunctionProperties (10) ; testManager.success ();)

Lendo o código que chama as funções declaradas demora um pouco para se acostumar. Antes de cada chamada de função, o identificador é utilizado como se fosse um objeto. Depois que o objeto é referenciado, o objeto é chamado como uma função. Estes exemplos indicam claramente que as funções têm uma natureza dupla, onde as funções são objetos e os objetos podem ser funções. Esta dupla natureza coloca um problema: como é que a implementação da função saber a instância da função? O código a seguir ilustra este problema.

 Fonte: / website / ROOT / ajaxrecipes / javascript / function_with_properties functionsareobjects.html: function () (VariableFunctionProperties.value = 10; VariableFunctionProperties (10); FunctionFunctionProperties.value = 10; FunctionFunctionProperties (10); InstantiatedFunctionProperties.value = 10; InstantiatedFunctionProperties (10) ; testManager.success ();)

Lendo o código que chama as funções declaradas demora um pouco para se acostumar. Antes de cada chamada de função, o identificador é utilizado como se fosse um objeto. Depois que o objeto é referenciado, o objeto é chamado como uma função. Estes exemplos indicam claramente que as funções têm uma natureza dupla, onde as funções são objetos e os objetos podem ser funções. Esta dupla natureza coloca um problema: como é que a implementação da função saber a instância da função? O código a seguir ilustra este problema.

 Fonte: / website / ROOT / ajaxrecipes / javascript / GetFunction função functionsareobjects.html () (return function (cmpvalue) (assertEquals (cmpval, unknownfunctioninstance. value);))

No exemplo, a função GetFunction tem uma aplicação que retorna uma instância única função cada vez GetFunction é chamado. Se você quisesse fazer referência a uma propriedade da instância de função, seria duramente pressionado a fazê-lo, porque uma função anônima não associado tem identificador. Nos exemplos anteriores, a referência à instância função foi utilizada para fazer referência a propriedades e métodos do objeto função. Usando essa forma de declarar a função, não existe identificador de instância associados, e não há maneira de poder fazer referência a propriedade da função anônima. A solução é usar uma variável interna que é referenciado, como demonstra o seguinte exemplo.

 Fonte: / website / ROOT / ajaxrecipes / javascript / functionsareobjects.html função GetFunctionFixed () (var inst = function (cmpval) (assertEquals (cmpval, inst.value);) return inst;)

Como o código que resolve o problema da ocorrência de fato desconhecido até mesmo obras podem parecer um tanto misteriosa à primeira vista. Ela envolve o uso de uma técnica de programação comumente conhecido como um encerramento. Para entender como o encerramento de trabalho, lembre-se pensar em uma função como um objeto, e não alguma função-chave const. Veja o que acontece em poucas palavras:

1. O chamador solicita GetFunctionFixed.

2. A implementação de GetFunctionFixed é executado.

3. Uma função anônima é declarada, e um objeto função é instanciado.

4. A função instanciado anônimo é atribuído ao local declarado inst variável.

5. O anônimo função inst referências, eo processador JavaScript entende isso e cria uma referência ao local variável declarada.

6. A variável inst é retornado ao chamador.

7. As tentativas de lixo coletor de lixo para recolher inst, mas não pode porque as referências função anônima inst enquanto anónimo é referenciado em algum lugar. Quando você considera as etapas deste processo, juntamente com o fato de que tudo é um objeto, ele se torna fácil de ver como este código funciona. Quando um objeto faz referência outro objeto, os objetos só podem ser lixo coletado, se não fazer nada de referência. Quando utilizar as funções e tratá-los como objetos, manter os seguintes pontos em mente:

• As funções são objetos, e você pode manipulá-los como qualquer outro objetos JavaScript. Entanto, porque as funções são objetos, utilizando funções de forma abusiva ou propriedades das funções indevidamente podem causar vazamentos de memória, Onde a memória é referenciada e não lixo coletado, mesmo que o script não está fazendo uso da memória.

• A configuração de funções ou métodos é possível quando a página HTML que está sendo carregado. Isso economiza processamento da lógica, como o código não é necessário para determinar o código deve ser executado.

• É preciso um pouco de tempo e experimentação para se acostumar com a idéia de que o comportamento do código é determinado em tempo de execução, e não enquanto você está escrevendo o código.

• objetos sendo, as funções podem propriedades ou métodos de referência, permitindo que as funções para definir o comportamento em tempo de execução. Se você atribuir propriedades ou métodos de funções, em seguida, fazê-lo com a compreensão de que as propriedades e métodos são transitórios, ou seja, se uma função é copiado de uma instância para outra, não assumir que as propriedades são copiados também.

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 "JavaScripot Funções" 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: 378 users browsing the articles directory