2010-09-14 10 views
6

Según tengo entendido, en Javascript los objetos y las matrices se pasan como referencias y no como valores para los argumentos de las funciones. Un grupo jQuery es un objeto y, por lo tanto, se debe pasar como referencia.El objeto jQuery pasado como argumento a la función es copia de valor no referencia?

Sin embargo, encuentro en el script de prueba a continuación que algo extraño está sucediendo; el grupo jQuery se comporta como un valor, no como una referencia, a menos que esté envuelto en otro objeto ... ¿alguien puede explicar esto?

<html> 
<head> 
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script> 
</head> 
<body> 
<script> 

function test(arg){ 
    arg = arg.add($('<span/>')) 
    console.log(arg); 
}; 

ele = $('<div/>'); 
test(ele); // div + span in the group as expected 
console.log(ele); // only the div - the 'arg' param in function was a copy 

function test2(arg){ 
    arg.a = arg.a.add($('<span/>')); 
    console.log(arg.a); 
}; 

obj = {a:ele}; 
test2(obj); // div + span in the group as expected 
console.log(obj.a); // both in the group - arg acted like a reference! 

</script> 
</body> 
</html> 

Respuesta

3

Esta es una "característica" del método .add(). No modifica el objeto jQuery original, sino que devuelve un nuevo objeto con el valor agregado.

Dado su primer ejemplo, deberá devolver la variable arg y sobrescribir ele.

function test(arg){ 
    arg = arg.add($('<span/>')) 
    console.log(arg); 
    return arg; // return the new jQuery object stored in "arg" 
}; 

ele = $('<div/>'); 
ele = test(ele); // overwrite the original "ele" with the returned value 
console.log(ele); 

EDIT: Para dar otro ejemplo, utilizando su código, pero con .push() que modifica el objeto original, verá el valor correcto actualizada en ele.

function test(arg){ 
    arg = arg.push($('<span/>')[0]) 
    console.log(arg); // Because .push() is being used, "arg" will reference 
         // the new length of the array. 
}; 

ele = $('<div/>'); 
test(ele); 
console.log(ele); // Will reference jQuery object with both elements 

EDIT: vez última ilustración. Debido .add() devuelve un nuevo objeto, se puede actualizar ambas variables apuntan al mismo valor de la siguiente manera:

ele = arg = arg.add($('<span/>')); 

Ahora en lugar de ele referencia a la original, y arg referencia a un nuevo objeto creado, ambas variables tienen una referencia al mismo objeto en la memoria.

+1

* Esta es una "característica" del método .add(). * - hace que suene como si fuera posible con otro método si estuviera codificado como tal. El hecho es que se establece un nuevo valor para la variable 'arg' dentro de la función y no modifica la variable' ele' en el alcance externo que el OP cree que se ha pasado en "referencia". –

+0

@Andy E - En realidad es posible. Daré otro ejemplo usando el código original de OP, pero con 'push()' en su lugar. Modifica correctamente el objeto jQuery y las referencias 'ele' que cambiaron el objeto. – user113716

+0

@Andy E - Ok, tal vez estoy malinterpretando el significado correcto de * "pasar por referencia" *. Cuando pasas una variable, pasas una referencia a su valor, que creo que es el mismo tipo de cosas que verías en otros lenguajes orientados a objetos como Java, por ejemplo. ¿Estoy equivocado? En cualquier caso, ambas soluciones ilustran los conceptos adecuados dentro de javascript. – user113716

0

Las dos pruebas que realizó no son las mismas. El primero establece una variable arg al valor arg.add(...), mientras que el segundo conjunto es una propiedad en arg denominada a con el valor arg.a.add(...). Pasar "por referencia" en JavaScript no es realmente lo mismo que en otros idiomas (de hecho, algunos estarían en desacuerdo con que realmente se pase de referencia). Cuando pasa una variable cuyo tipo es un objeto, tiene una referencia a su valor y no a la variable original.

Cuando configura arg = arg.add(...), está estableciendo un nuevo valor para la variable arg y anulando su valor anterior. Esto no modificará la variable que se pasó, porque no tiene una referencia, solo tiene una referencia a su valor (el objeto).

Cuestiones relacionadas