O "Module Patern" tira proveito dos "closures" do JS. Quando uma função declara variáveis dentro dela e também declara outras funções ou objetos estes objetos e funções têm acesso às variáveis declaradas. Ex:
pessoa = function(nome,telefone) {
var nome = nome;
var telefone = telefone;
this.nome2 = "nome2 - " + nome;
return {
mostra: function() {
document.writeln('Nome:' + nome + '< br / >');
document.writeln('Telefone:' + telefone + '< br / >');
}
};
}
A função "mostra" do objeto retornado no código acima, por estar definida dentro da função pessoa, tem acesso às variáveis "nome" e "telefone".
O interessante é que mesmo depois de a função pessoa ter sido executada, o objeto continua tendo acesso àquelas variáveis. Isto quer dizer que se chamarmos:
p = pessoa('joao','3344 5678');
vai acontecer o seguinte:
1 - a função pessoa será executada declarando as variáveis "nome" e "telefone"
2 - ela vai retornar um objeto, definido por um código JSON, com um método mostra()
3 - este método mostra vai ter acesso às variáveis "nome" e "telefone" já declaradas.
4 - como a função já foi executada, não temos mais como mexer nas variáveis "nome" e "telefone" a não ser pelo "mostra".
5 - com isso criamos um escopo "privado" para as variaveis definidas.
O mesmo método pode ser usado para retornar uma função:
mostraLista = function(nome,telefone) {
var lista = {'segredo1':'noite','segredo2':'dia'};
return function() {
for(i in lista) {
document.writeln(i + ':' + lista[i] + '< br / >');
}
}
}();
Neste caso repare que depois da declaração já executamos a função. Com isso fazemos o seguinte:
1 - a função é executada declarando o objeto "lista";
2 - ela retorna uma outra função, que fica atribuida a "mostraLista"
3 - esta função retornada fica com acesso "privado" a variável "lista"
assim podemos chamar
mostraLista();
para que este método seja executado com acesso ao objeto. Porém não podemos acessar diretamente por "mostraLista.lista" pois este objeto não existe, o que existe é o acesso dele à variável da função que já foi executada. Caso você queira experimentar, veja que o valor será igual a "undefined".
Nenhum comentário:
Postar um comentário