Pergunta

Eu ouvi de uma variedade de lugares que as variáveis ??globais são inerentemente desagradável e mal, mas ao fazer alguns não-orientado a objeto Javascript, eu não posso ver como evitá-los. Digamos que eu tenha uma função que gera um número usando um algoritmo complexo usando números aleatórios e outras coisas, mas eu preciso continuar usando esse número especial em alguma outra função que é uma chamada de retorno ou algo assim e por isso não pode ser parte da mesma função.

Se o número originalmente gerada é uma variável local, não será acessível a partir, não. Se as funções eram métodos de objeto, eu poderia fazer o número um imóvel, mas eles não são e parece um pouco demasiado complicada de mudar toda a estrutura do programa para fazer isso. É uma variável global realmente tão ruim?

Foi útil?

Solução

Para fazer uma variável calculada em função Um visíveis em função B, você tem três opções:

  • torná-lo um global,
  • torná-lo uma propriedade do objeto, ou
  • passá-lo como um parâmetro ao chamar B de A.

Se o seu programa é bastante pequenos globals então não são tão ruins. Caso contrário, eu consideraria usar o terceiro método:

function A()
{
    var rand_num = calculate_random_number();
    B(rand_num);
}

function B(r)
{
    use_rand_num(r);
}

Outras dicas

Eu acho que sua melhor aposta aqui pode ser para definir um única variável global com escopo, e despejar suas variáveis ??lá:

var MyApp = {}; // Globally scoped object

function foo(){
    MyApp.color = 'green';
}

function bar(){
    alert(MyApp.color); // Alerts 'green'
} 

Ninguém deve gritar com você para fazer algo como o acima.

Considere o uso de namespaces:

(function() {
    var local_var = 'foo';
    global_var = 'bar'; // this.global_var and window.global_var also work

    function local_function() {}
    global_function = function() {};
})();

Ambos local_function e global_function têm acesso a todas as variáveis ??locais e globais.

Editar : Outro padrão comum:

var ns = (function() {
    // local stuff
    function foo() {}
    function bar() {}
    function baz() {} // this one stays invisible

    // stuff visible in namespace object
    return {
        foo : foo,
        bar : bar
    };
})();

As propriedades returned pode agora ser acedido através do objecto espaço de nomes, por exemplo ns.foo, mantendo o acesso a definições locais.

O que você está procurando é tecnicamente conhecido como currying.

function getMyCallback(randomValue)
{
    return function(otherParam)
    {
        return randomValue * otherParam //or whatever it is you are doing.
    }

}

var myCallback = getMyCallBack(getRand())

alert(myCallBack(1));
alert(myCallBack(2));

O acima não é exatamente uma função curry mas atinge o resultado da manutenção de um valor existente sem adicionar variáveis ??para o namespace global ou exigindo algum outro repositório de objetos para ele.

Se outra função precisa usar uma variável que você passá-lo para a função como um argumento.

Além disso variáveis ??globais não são inerentemente desagradável e mal. Enquanto eles são usados ??corretamente não há nenhum problema com eles.

Se há uma chance de que você vai reutilizar esse código, então eu provavelmente iria fazer um esforço para ir com uma perspectiva orientada a objetos. Usando o namespace global pode ser perigoso - você corre o risco de difícil encontrar erros devido a nomes de variáveis ??que são reutilizados. Normalmente eu começo usando uma abordagem orientada a objetos para algo mais do que uma chamada de retorno simples para que eu não tenho que fazer o que é re-escrever. Qualquer momento que você tem um grupo de funções relacionadas em javascript, eu acho, é um candidato para uma abordagem orientada a objetos.

Outra abordagem é aquele que eu peguei de um post no fórum Douglas Crockford ( http : //bytes.com/topic/javascript/answers/512361-array-objects ). Aqui está ...

Douglas Crockford escreveu:

15 jul '06

"Se você quiser recuperar objetos por id, então você deve usar um objeto, não um matriz. Desde funções também são objetos, você pode armazenar os membros do própria função. "

function objFacility(id, name, adr, city, state, zip) {

    return objFacility[id] = {

        id: id,
        name: name,
        adr: adr,
        city: city,
        state: state,
        zip: zip

    }
}

objFacility('wlevine', 'Levine', '23 Skid Row', 'Springfield', 'Il', 10010);

"O objeto pode ser obtido com"

objFacility.wlevine

Os objetos propriedades estão agora acessível a partir de qualquer outra função.

Eu encontrei este para ser extremamente útil em relação à pergunta inicial:

retornar o valor que você deseja usar em functionOne, em seguida, chamar functionOne dentro functionTwo, em seguida, coloque o resultado em um novo var e referência Esta nova var dentro functionTwo. Isso deve permitir que você use o var declarou em functionOne, dentro functionTwo.

function functionOne() {
  var variableThree = 3;
  return variableThree;
}

function functionTwo() {
  var variableOne = 1;
  var var3 = functionOne();

  var result = var3 - variableOne;

  console.log(variableOne);
  console.log(var3);
  console.log('functional result: ' + result);
}

functionTwo();

Eu não sei detalhes de seu problema, mas se a função precisa do valor, então ele pode ser um parâmetro passado por meio da chamada.

Globals são consideradas ruins porque globals Estado e vários modificadores pode criar difícil de seguir código e erros estranhos. Para muitos atores mexer com algo pode criar o caos.

Você pode controlar completamente a execução de funções javascript (e passar variáveis ??entre eles) usando eventos jQuery personalizado .... I foi dito que isso não era possível em todos esses fóruns, mas eu tenho trabalho algo que faz exatamente isso (mesmo usando uma chamada ajax).

Aqui está a resposta (IMPORTANTE: não é a resposta marcada, mas sim a resposta por mim "Emile"):

Como se uma variável devolvidos através múltiplas funções - Javascript / jQuery

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top