2011-02-08 18 views
8

¿Hay una manera de utilizar un tipo de los C# -como out o ref modificadores de parámetros con Javascript para hacer algo como esto:¿Devolviendo valores múltiples en javascript?

function myManyReturnFunction(number1, number2, out x, out y) { 
    x = number1 * number2; 
    y = number1/number2; 

    return true; 
} 

var height1, height2 = 0; 
var check = myManyReturnFunction(1,1, out height1, out hight2); 

me gustaría cambiar la referencia de la variable así. Entonces sí, pasando un argumento por referencia.

+1

Así que algo así como pasar por referencia? – kjy112

+1

Creo que algo así como devolver una matriz asociativa sería el camino de JavaScript a seguir, pero si intentas replicar pasar por referencia, esto podría ser interesante: http://sirdarckcat.blogspot.com/2007/07/ passing-reference-to-javascript.html – kloffy

+0

@kloffy esa publicación del blog está llena de errores y malentendidos. No confiaría en ella para nada – Pointy

Respuesta

18
function myManyReturnFunction(number1, number2) { 
    return { 
     x: number1 * number2, 
     y: number1/number2 
    } 
} 

Y no es necesario x y y parámetros, simplemente llame al:

var result = myManyReturnFunction(6, 9); 
var x = result.x; 
var y = result.y; 
3

Puede crear un "objeto" ...

function getObj(){ 
var objOut = new Object(); 
objOut.name = "Smith"; 
objOut.State = "Arkansas"; 

return objOut; 
} 
0

Puede volver tipos no primitivos:

function blah() { 
    return { name: 'john', age: 23 }; 
}; 

var x = blah(); 
3

Si define las variables 'out' en el ámbito global fuera de si su función que puede ser reasignado dentro de la función con algo como esto:

var height1 = 0, height2 = 0; 

function myManyReturnFunction(number1, number2) { 
    height1 = number1 * number2; 
    height2 = number1/number2; 

    return true; 
} 


var check = myManyReturnFunction(1,1); 

También puede crear un objeto, que luego se puede pasar a su función, que se puede modificar dentro de la función como así:

var myValues = {} 

function setValues(num1, num2, vals) { 
    vals.x = num1 * num2; 
    vals.y = num1/num2; 

    return True; 
} 

setValues(1, 1, myValues); 
2

Existen varias formas de devolver valores múltiples en JavaScript. Siempre has sido capaz de devolver múltiples valores en una matriz:

function f() { 
    return [1, 2]; 
} 

y acceder a ellos de esta manera:

var ret = f(); 
document.write(ret[0]); // first return value 

embargo, la sintaxis es mucho más agradable en JavaScript 1.7 con la adición de asignación desestructurada (Si tienes la suerte de tener como objetivo un ambiente garantizado para apoyarlo (por ejemplo, una extensión de Firefox)):

var a, b; 
[a, b] = f(); 
document.write("a is " + a + " b is " + b + "<br>\n"); 

Otra opción es devolver un objeto literal que contiene se valores de r:

function f() { 
    return { one: 1, two: 2 }; 
} 

que luego se puede acceder por nombre:

var ret = f(); 
document.write(ret.one + ", " + ret.two); 

Y, por supuesto, se podría hacer algo realmente horrible como modificar el alcance global o propiedades incluso ajustado en la función propia:

function f() { 
    f.one = 1; 
    f.two = 2; 
} 

f(); 

document.write(f.one + ", " + f.two); 

Más lectura (y la fuente de algunos de estos ejemplos):

https://developer.mozilla.org/en/New_in_JavaScript_1.7#Destructuring_assignment_(Merge_into_own_page.2fsection)

+0

Más corto: var [a, b] = f(); –

Cuestiones relacionadas