Início > Javascript > O problema com as variáveis globais no Javascript

O problema com as variáveis globais no Javascript

O Javascript é uma linguagem que muitos vêm como limitada, mas que, na minha opinião, tem seu valor. Por ser um pouco renegada, a maioria não se importa em entender muito bem como ela funciona, só quer saber o básico da sintaxe para fazer o que precisa.

Uma dúvida comum quando se está começando é sobre declaração de variáveis: quando e porque utilizar o var? Vejamos um exemplo:

var numero = 1;

function exibe()
{
    alert(numero);
}

exibe();

Conforme esperado, o valor 1 é exibido, já que a variável numero é global. Para confirmar essa informação, vamos fazer:

var numero = 1;

function exibe()
{
    alert(numero);
}

function altera()
{
    numero = 2;
}

exibe();
altera();
exibe();

Como resultado, são exibidos os valores 1 e 2. Assim, a função altera está modificando o valor da variável global numero.

Afinal, onde o var se encaixa nessa história? O var serve para declarar o escopo da variável. Se uma variável é declarada sem o var, ela é automaticamente global. Quer ver?

function define()
{
    numero = 1;
}

function exibe()
{
    alert(numero);
}

define();
exibe();

O número 1 é exibido. Para confirmar, faça o seguinte:

function define()
{
    var numero = 1;
}

function exibe()
{
    alert(numero);
}

define();
exibe();

Neste caso ocorre o seguinte erro: ReferenceError: numero is not defined. Isto ocorre pois a variável numero pertence ao escopo da função define e, portanto, não pode ser acessada de dentro da função exibe.

Quais são as implicações disso? Considere o seguinte exemplo:

var Cachorro = function(nome)
{
    _nome = nome;

    this.get_nome = function()
    {
        return _nome;
    }

    // (...)
}

var Gato = function(nome)
{
    _nome = nome;

    this.get_nome = function()
    {
        return _nome;
    }

    // (...)
}

rex = new Cachorro('Rex');
mimi = new Gato('Mimi');
alert(rex.get_nome());
alert(mimi.get_nome());

Neste caso, é exibido Mimi duas vezes, ao invés do que esperávamos: Rex e Mimi. Isto acontece pois, ao contrário do que pretendíamos, _nome é uma variável global, e o último valor que é atribuído a ela é ‘Mimi’ (dentro do “construtor” da classe Gato).

Para evitar este tipo de problema, sempre declare suas variáveis no Javascript utilizando o var. O código corrigido ficaria assim:

var Cachorro = function(nome)
{
    var _nome = nome;

    this.get_nome = function()
    {
        return _nome;
    }

    // (...)
}

var Gato = function(nome)
{
    var _nome = nome;

    this.get_nome = function()
    {
        return _nome;
    }

    // (...)
}

var rex = new Cachorro('Rex');
var mimi = new Gato('Mimi');
alert(rex.get_nome());
alert(mimi.get_nome());

Tags:
  1. Ygor
    18/01/2010 às 12:27 | #1

    Muito bom o post!

    Como eu, para quem veio de outras linguagens, o escopamento (?) de função do Javascript (em contraste com, por exemplo, escopamento de bloco, como é o do C) pode confundir um pouco.

    Tem um artiguinho minúsculo muito bom sobre isso no link abaixo que pode evitar bugs chatos… dêem uma olhada!

    http://knowledge-aholic.blogspot.com/2009/12/javascripts-function-scope.html

    Abraços!

    • Alex Tercete
      18/01/2010 às 22:47 | #2

      Ótimo complemento, Ygor! Valeu!

  1. Nenhum trackbacks ainda.

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Sair / Alterar )

Imagem do Twitter

You are commenting using your Twitter account. Sair / Alterar )

Foto do Facebook

You are commenting using your Facebook account. Sair / Alterar )

Connecting to %s

Seguir

Obtenha todo post novo entregue na sua caixa de entrada.