2012-06-08 10 views
9

¿Es cierto que las funciones de JavaScript devuelven objetos distintos de Boolean y Numbers por referencia?Volviendo por referencia en JavaScript?

¿Cómo es posible cuando esos objetos se destruyen cuando termina la función a la que pertenecen?

+0

Javascript no es C. – doug65536

Respuesta

17

Los objetos no se destruyen hasta que todos se han ido y se han recogido basura. Cuando se devuelve el objeto, el código de llamada obtiene una referencia al mismo y el objeto no se recolecta.

Técnicamente, el marco de pila de la función llamada se destruye cuando vuelve. El objeto, sin embargo, no está en la pila, sino en el montón. La referencia local de la función al objeto está en la pila y, por lo tanto, se destruye, pero la referencia del código de llamada no se destruye hasta un tiempo después.

Como nota al margen, no es realmente importante cómo se devuelve, porque la función no puede utilizar el objeto de todos modos después de que vuelva.

+0

El registro de activación en sí mismo puede persistir cuando la función retorna, si la función afectó su alcance externo de manera tal que expone una referencia a él. Es decir, si una función instancia una función, y esa función hace referencia al alcance local (el registro de activación, o "marco de pila", que realmente no es), y esa función se devuelve o asigna a alguna variable relativamente global o propiedad, entonces el registro de activación permanece disponible y no se recopila. – Pointy

8

¿Es cierto que en las funciones de JavaScript devuelven objetos distintos de Boolean y Numbers por referencia?

Es cierto, los objetos en JavaScript son siempre pasado por referencia

¿Cómo es posible cuando esos objetos destruidos cuando la función pertenecen a los termina?

Solo se destruyen las referencias, no los valores en sí. Y mientras no queden referencias, el objeto es un candidato para recoger basura.

6

Dos grandes respuestas allí, pero sólo pensé que debería agregar que es bastante fácil de prueba:

function modify(arg) { 
    arg.modified = true; 
} 
test = 4; 
modify(test); 
console.log(test.modified); // undefined 
test = {}; 
modify(test); 
console.log(test.modified); // true 
test = ""; 
modify(test); 
console.log(test.modified); // undefined 

donde indefinido significa que ha sido copiado en lugar de ser pasado por referencia. Tenga en cuenta que las cadenas tampoco se pasan por referencia.

2

Los argumentos (incluidos los objetos) se envían a una función por valor. Las propiedades de un objeto de argumento están disponibles y son modificables que se comportan como referencias. Mira el siguiente ejemplo:

function changeObj(obj){obj.a *= 10; return true;} 
function killObj(obj){obj = null; return true;} 
function changeAndKillObj(obj){obj.a += 1; obj = null; return true;} 
var a = {a:1, b:'test'}; 
console.log(a); //Object {a:1, b:'test'} 
changeObj(a); 
console.log(a); //Object {a:10, b:'test'} 
killObj(a); 
console.log(a); //Object {a:10, b:'test'} 
changeAndKillObj(a); //Object {a:11, b:'test'} 

En pocas palabras: Usted puede hacer lo que quiera con las propiedades del objeto, pero no con el propio objeto. Cualquier asignación al argumento lo convierte en un objeto diferente y se desvincula del objeto inicial.

Cuestiones relacionadas