2015-02-08 2 views
0

Я ищу способ определения аргументов функции javascript массивом, чтобы, например, работал следующий код. Является ли это возможным?Определить имена аргументов Javascript с массивом

args = ["foo", "bar"] 
func = function(???) { //not sure what (if anything) could go here to make it work 
    console.log(foo) 
    console.log(bar) 
} 
func (5, "good times") // logs "5" and "good times" 

EDIT: Предлагаемые решения являются хорошими, но не решают проблему, поскольку важно сохранить конкретное имя. У меня есть функция с чрезвычайно длинным списком аргументов, и я бы скорее определил их как массив, а затем в определении фактической функции.

+0

Вы не можете делать то, о чем просите; это просто не средство, предоставляемое на языке JavaScript. – Pointy

+0

Да, это было то, чего я боялся. Просто подумал, что я спрошу. Спасибо за вашу помощь. –

+0

На самом деле, я нашел способ сделать это, описанный ниже. –

ответ

0

Вдохновленный ответом @ pointy, я придумал способ сделать это, хотя it does pollute the global namespace a bit.

args = ["foo", "bar"] 
func = function() { 
    for (i = 0, len = args.length; i < len; i = ++i) { 
     arg = args[i]; 
     window[arg] = arguments[i]; 
    } 
    console.log(foo) 
    console.log(bar) 
} 
func (5, "good times") // logs "5" and "good times" 
0

Вы можете просто передать массив и используя for Переберите значений массива:

func = function(array) { 
    for(var i=0; i<array.length; i++){ 
     console.log(array[i]); 
    } 
} 
+1

@ Вы уверены, что правы. Я только что исправил это. Большое спасибо. – Christos

1

Внутри функции, аргументы доступны через специальный объект, называемый arguments:

function magic() { 
    for (var i = 0; i < arguments.length; ++i) 
    console.log(arguments[i]); 
} 

magic("hello", "world"); // two console entries, "hello" and "world" 

В arguments объект как массив, но он другой. Важно быть осторожным, если производительность важна, потому что у объекта есть некоторые необычные свойства, которые вызывают проблемы для современных оптимизаторов JavaScript.

Это не представляется возможным дать имена параметров после вызова функции выполнена, хотя (если вы действительно хотите) вы можете создать объект и скопировать аргументы в него:

function weird() { 
    var parameters = {}; 
    for (var i = 0; i < arguments.length; ++i) 
    parameters["arg" + i] = arguments[i]; 
    // ... 
} 
0

Возможно, вы ищет метод .apply(), который позволяет передавать ряд аргументов в виде массива, и он будет распаковывать их в обычные аргументы при вызове функции.

var args = ["foo", "bar"]; 
var func = function() { 
    // any arguments pass to the function can be accessed via 
    // the arguments pseudo-array 
    console.log(arguments[0]); // "foo" 
    console.log(arguments[1]); // "bar" 
} 
func.apply(null, args); 

Или, еще можно было объявить имена аргументов в объявлении функции:

var args = ["foo", "bar"]; 
var func = function(arg1, arg2) { 
    console.log(arg1); // "foo" 
    console.log(arg2); // "bar" 
} 
func.apply(null, args); 

Если вы хотите именованные аргументы, когда абонент устанавливает имена, которые передаются, вы можете передать объект в функцию:

var args = {foo: "goodbye", bar: "hello"}; 
var func = function(options) { 
    console.log(options.foo); // "goodbye" 
    console.log(options.bar); // "hello" 
} 
func(args); 
0

Похоже, что вы ищете ключевые аргументы, как в Python:

# define a func  
def func(foo, bar): 
    .... 

# call it 
func(bar=123, foo=456) 

Javascript (по ES5) не обеспечивает такой синтаксис, это обычно моделируется с использованием объектов:

function func(args) { 
    console.log(args.foo); 
    console.log(args.bar); 
} 

// call it 
func({ 
    bar: 123, 
    foo: 456 
}); 
Смежные вопросы