Javascript: передача нескольких аргументов в качестве одной переменной - PullRequest
7 голосов
/ 12 августа 2010

возможно ли передать несколько аргументов, используя одну переменную? Например, если я хотел сделать что-то вроде:

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

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

Пример выше - это упрощенный пример того, что я пытался сделать. Это не работает (потому что «бар» определяется как один аргумент). Я знаю, что есть более простые способы реализовать это с помощью массивов.

Итак, я задаю этот вопрос в основном из любопытства - возможно ли, чтобы переменная "bar" была обнаружена как не один, а 2 аргумента?

Спасибо!

Ответы [ 10 ]

12 голосов
/ 12 августа 2010
function foo(thing) {
    document.write("X is " + thing.x);
    document.write("Y is " + thing.y);
}

var bar = {x:0, y:10};
foo(bar);
4 голосов
/ 13 августа 2010
function Add (a, b, c) {
    return a + b + c;
}

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

список аргументов переменной длины:

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);

Ссылка: применить метод (объект функции)

4 голосов
/ 12 августа 2010

То, что вы просите, невозможно.Если вы хотите передать несколько значений в одном аргументе, используйте Array или Object.Если вы действительно должны использовать строку, вам придется вызвать split(), чтобы разбить строку аргумента на массив.

1 голос
/ 12 августа 2010

Конечно, это обычно, чтобы передать объект для параметров

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

, тогда вы можете передать что-нибудь ...

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

Часто они определяются встроенными, особенно еслизначения не нужны вне вызова метода.

foo({'x':5,'y':23,'border':3});
1 голос
/ 12 августа 2010

Не совсем.

Вы можете сделать:

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

(Применить позволяет передавать массив аргументов вместо каждого аргумента отдельно)

… но фразана ум приходит "некрасивый".

0 голосов
/ 28 марта 2013
function myFunction(a,b){
//do stuff with a and b here
}

myFunction(1,'text')

или ...

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

По этому вопросу есть статья .

0 голосов
/ 12 августа 2010

Чтобы прямо ответить на ваш вопрос, нет. Стоит отметить, что, как вы определили bar, это только одно значение, строка, содержащая «0,10».

0 голосов
/ 12 августа 2010

Нет, это невозможно. Вы можете поместить два аргумента в массив, но массив по-прежнему является одной переменной. Затем вам нужно будет переписать функцию, чтобы она принимала одну переменную, и обрабатывать ее как массив, например:

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

По сути, функция принимает переменные в качестве аргументов, и, независимо от того, какую переменную вы передаете, каждая переменная по-прежнему является только одной переменной - нет способа получить одну переменную, которая будет распознана как несколько аргументов. Массив - это одна переменная, объект JSON - это одна переменная и т. Д. Эти элементы состоят из нескольких частей, но они заключены в одну переменную.

0 голосов
/ 12 августа 2010

Нет, но вы можете передать массив или объект:

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

var bar = {x: 0, y:10};
0 голосов
/ 12 августа 2010

Вы можете использовать это:

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

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