Johann Luschnic Vivot
johan...@gmail.com
+55 11 6446-1244 | +55 11 7338-4359
http://gordao.net/
Henrique, grato por sua contribuição!
O estilo de passagem de parâmetros por referência em JavaScript é o
mesmo que existe em Python, Ruby e muitas outras linguagens.
O que acontece com este código é o seguinte:
function swop(a, b){
var c = a;
a = b;
b = c;
}
Quando vocẽ escreve a = b o que você está fazendo é criar uma "nova"
referência de nome "a", e atribuindo a ela o valor de b. A melhor
forma de entender isso é esquecer a velha metáfora de que variáveis
são receptáculos onde se armazena valores. Em linguagens que trabalham
com referências, como JavaScript, Python, Ruby, as variáveis não são
receptáculos, elas são rótulos que apontam para objetos que já existem
na memória antes mesmo da atribuição acontecer. Isso vale inclusive
para as variáveis de objetos em Java (mas não para as variáveis
primitivas, tipo int etc). Portanto a atribuição não representa
colocar um valor em um container, mas sim associar um símbolo a um
valor.
Eu tenho uns slides que exemplificam isso, em Python, mas a idéia é a
mesma em JavaScript:
http://www.slideshare.net/ramalho/python-a-primeira-mordida-presentation
Veja os slides 57, 58 e 59.
Preciso fazer um podcast para explicar porque o audio é essencial...
--
Luciano Ramalho
programador repentista || stand-up programmer
Twitter: @luciano
Sim, a única forma de mudar é passando um objeto ou usando uma variável global.
Agora, essa dificuldade na verdade é uma coisa boa. É bem documentado
o fato de que funções que alteram objetos externos a seu escopo são a
causa de muitos bugs difíceis de resolver. Inclusive algumas
linguagens funcionais mais "puras", como Haskell e Erlang,
praticamente proibem a mutabilidade, ou apenas permitem que ela ocorra
em contextos muito restritos.
Muitas vezes a pasagem de estruturas para serem manipuladas por
funções é uma forma de otimização prematura. O mais seguro é
simplesmente passar cópias dos valores. Note que em JavaScript,
Python, Ruby e Java, por exemplo, as strings são imutáveis. Vocé não
consegue substituir os caracteres de uma string por outros, apenas
consegue criar uma nova string a partir da transformação dos
caracteres de outra, entende? Isso é diferente do que acontece em C e
Pascal. Mas não é ruim, a maior parte do tempo a gente nem percebe.
Veja por exemplo os docs oficiais do método String.replace:
https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/String/replace
Primeira linha:
Returns a new string with some or all matches of a pattern replaced by
a replacement.
Ou seja, o método replace não muda a string, devolve uma nova string.
Na dúvida, essa é a melhor forma de implementar as suas funções.