2010-08-12 14 views
7

¿es posible pasar múltiples argumentos usando una sola variable? Por ejemplo, si quería hacer algo como:Javascript: pasando múltiples argumentos como una sola variable

function foo(x,y){ 
    document.write("X is " + x); 
    document.write("Y is " + y); 
} 

var bar = "0,10"; 
foo(bar); 

El ejemplo anterior es un ejemplo simplificado de lo que estaba tratando de hacer. No funciona (porque la "barra" se detecta como un único argumento). Sé que hay formas más fáciles de implementar esto usando matrices.

Por lo tanto, hago esta pregunta principalmente por curiosidad: ¿es posible detectar la variable "bar" como no uno, sino 2 argumentos?

Gracias!

+0

Tema relacionado: La palabra clave 'argumentos' le indica los argumentos pasados ​​a la función. Por ejemplo: función a() {alerta (argumentos [1])}; a (1, 2); Esto alertará ('2'); – Topera

Respuesta

0

Usted puede usar esto:

var bar = [0,10]; // creates an array 
foo(bar); 

function foo(arg){ 
    document.write("X is " + arg[0]); 
    document.write("Y is " + arg[1]); 
} 
11
function foo(thing) { 
    document.write("X is " + thing.x); 
    document.write("Y is " + thing.y); 
} 

var bar = {x:0, y:10}; 
foo(bar); 
4

Lo que estamos pidiendo es imposible. Si desea pasar múltiples valores en un solo argumento, use un Array o un Object. Si realmente debe usar una cadena, tendrá que llamar al split() para dividir la cadena del argumento en una matriz.

0

No, pero se podía pasar una una matriz u objeto:

function foo(options){ 
    document.write("X is " + options.x); 
    document.write("Y is " + options.y); 
} 

var bar = {x: 0, y:10}; 
1
No

realmente.

que podría hacer:

window.foo.apply(window, bar.split(',')); 

(Aplicar permite pasar una serie de argumentos en lugar de cada argumento por separado)

... pero la frase "feo" viene a la mente.

+1

Sí, la división de la cadena es fea, también se refiere a 'foo' usando' window.foo' es feo. Sin embargo, el uso de 'function.apply' no lo es! – adamse

0

No, no es posible. Podrías poner dos argumentos en una matriz, pero una matriz sigue siendo una variable. Entonces usted tendría que volver a escribir la función de aceptar una variable, y tratarlo como una matriz, como esto:

function foo(x){ 
document.write("X is " + x[0]); 
document.write("Y is " + x[1]); 
} 

Básicamente, una función acepta las variables como argumentos y, no importa qué tipo de la variable que se pasa, cada variable sigue siendo solo una variable: no hay forma de que una sola variable se reconozca como argumentos múltiples. Una matriz es una variable, un objeto JSON es una variable, etc. Estas cosas tienen varias partes, pero están encapsuladas por una sola variable.

0

Claro, esto es común a pasar un objeto de opciones

function foo(options){ 
    //... 
} 

entonces puede pasar en cualquier cosa ...

var opts = {};//create an object 
opts['x'] = 5;//set whatever properties you want 
opts['y'] = 23; 
opts['border'] = 3; 
foo(opts);//pass 1 argument, with as many values as you want 

A menudo, estos se definen en línea, especialmente si los valores no son necesario fuera de la llamada al método.

foo({'x':5,'y':23,'border':3}); 
+0

Voto a la baja, no hay descripción de lo que está haciendo. –

-1

Para responder directamente a su pregunta, no. Vale la pena señalar que la forma en que tiene bar definido es solo un valor, una cadena que contiene "0,10".

+0

Comente cuando realmente no tiene un código útil. –

3
function Add (a, b, c) { 
    return a + b + c; 
} 

var nums = [1, 2, 4]; 
var sum = Add.apply (null, nums); 

-longitud variable lista de argumentos:

function Add() { 
    var sum = 0; 
    for (var i = 0; i < arguments.length; i++) { 
     sum += arguments[i]; 
    } 
    return sum; 
} 
var n = Add (1, 2, 3, 4, 5); 

Referencia: apply method (Function object)

+0

voto abajo, no hay detalles sobre lo que está haciendo. –

+0

Gracias, funcionó conmigo :) –

-2
function myFunction(a,b){ 
//do stuff with a and b here 
} 

myFunction(1,'text') 

o ...

<a onClick="myFunction(1,'text');" 

Hay un artículo sobre el tema here.

+1

Eso está usando 2 argumentos, no 1 como solicitó el OP. – mdm

Cuestiones relacionadas