jueves, 18 de octubre de 2012

Javascript: Parámetros por valor y por referencia


Valores y referencias

Cuando programamos en Javascript suele ser confuso, o en algunos casos poco natural, la manera en que maneja los pasajes de parámetros en las funciones. Especialmente el caso cuando se pásan funciones de objetos. Solo a modo de recordatorio, al asignar un objeto, Javascript realiza la asignación por referencia, ya que la semántica del lenguaje (para los objetos) es siempre de esta forma.

Veamos algunos ejemplos concretos, empecemos por una funcion que recibe un atributo primitivo (un string, un número, etc.):
function funcion(x)
{
      // x == 1
      x = 2;
      // x == 5
}

var x = 1;
// x == 1
funcion(x);
// x = 1
En este ejemplo, el valor x se pasa por valor, luego, al volver de la funcion no se ve alterado. A continuacion, un ejemplo de un pasaje de parámetros con un objeto:
function objeto()
{
 this.value = 1;
}
var o = new objecto();
// o.value == 1

function funcion(fnc)
{
 fnc.value = 2;
}
funcion(o);
// o.value == 2
A diferencia del caso anterior, el objeto se pasa por referencia, por lo tanto, al modificar el valor de su atributo, la función tiene un efecto colateral.
Para finalizar un ejemplo más, donde se pasa por parámetro un método del objeto.
function objeto()
{
 this.value = 1;
}
objeto.prototype.add = function()
{
 this.value++;
}

var o = new objeto();
// o.value = 1
o.add();
// o.value = 2
function funcion(fnc)
{
 fnc(); // ejecuta la función pasada como parámetro
}
funcion(o.add);
// o.value = 2, es decir, no se modifica
El problema en este caso es que al utilizar la palabra 'this', se hace referencia al contexto del objeto, pero cuando se pasa por parametro la función dicho contexto se pierde, y se asigna el valor de un nuevo objeto 'value'. Se agrega este valor al objeto 'funcion'.

Espero quede claro, pero si no, los invito a escribir sus inquietudes.

Saludos!

Referencia: http://www.snook.ca/archives/javascript/javascript_pass/

No hay comentarios:

Publicar un comentario

Los comentarios son bienvenidos!!!