Действительно ли возможно отправить переменное количество аргументов функции JavaScript от массива?
var arr = ['a','b','c']
var func = function()
{
// debug
alert(arguments.length);
//
for(arg in arguments)
alert(arg);
}
func('a','b','c','d'); // prints 4 which is what I want, then 'a','b','c','d'
func(arr); // prints 1, then 'Array'
Я недавно записал много Python, и это - замечательный шаблон, чтобы смочь принять varargs и отправить их. например.
def func(*args):
print len(args)
for i in args:
print i
func('a','b','c','d'); // prints 4 which is what I want, then 'a','b','c','d'
func(*arr) // prints 4 which is what I want, then 'a','b','c','d'
Действительно ли возможно в JavaScript отправить массив, который будут рассматривать как массив arguments?
Update: Начиная с ES6, вы можете просто использовать синтаксис spread при вызове функции:
func(...arr);
Так как ES6, также если вы ожидаете, что ваши аргументы будут рассматриваться как массив, вы можете использовать синтаксис spread в списке параметров, например:
function func(...args) {
args.forEach(arg => console.log(arg))
}
const values = ['a', 'b', 'c']
func(...values)
func(1, 2, 3)
И вы можете комбинировать его с обычными параметрами, например, если вы хотите получать первые два аргумента по отдельности, а остальные - как массив:
function func(first, second, ...theRest) {
//...
}
И может быть полезно, что вы можете знать, сколько аргументов ожидает функция:
var test = function (one, two, three) {};
test.length == 3;
Но в любом случае, вы можете передать произвольное количество аргументов. ...
Синтаксис спреда короче и "слаще", чем apply
, и если вам не нужно устанавливать значение this
при вызове функции, то так будет лучше.
Вот пример apply, который был первым способом:
var arr = ['a','b','c'];
function func() {
console.log(this); // 'test'
console.log(arguments.length); // 3
for(var i = 0; i < arguments.length; i++) {
console.log(arguments[i]);
}
};
func.apply('test', arr);
В настоящее время я рекомендую использовать apply
только в том случае, если необходимо передать произвольное количество аргументов из массива и установить значение this
. В качестве первых аргументов, которые будут использоваться при вызове функции, если в нестроковом коде использовать null
, то apply
take - это значение this
, ключевое слово this
будет относиться к Глобальному объекту (окну) внутри func
, в строгом режиме, когда явно используется 'use strict' или в модулях ES, будет использоваться null
. Также обратите внимание, что объект arguments
на самом деле не является массивом, вы можете преобразовать его с помощью:
var argsArray = Array.prototype.slice.call(arguments);
And в ES6:
const argsArray = [...arguments] // or Array.from(arguments)
But you rarely use the arguments
object directly now now благодаря синтаксису spread.
В любой функции javascript можно передать столько значений, сколько захотите. Явно именованные параметры получат первые несколько значений, но ВСЕ параметры будут храниться в массиве аргументов.
Для передачи массива аргументов в "распакованном" виде можно использовать apply, например (c.f. Functional Javascript):
var otherFunc = function() {
alert(arguments.length); // Outputs: 10
}
var myFunc = function() {
alert(arguments.length); // Outputs: 10
otherFunc.apply(this, arguments);
}
myFunc(1,2,3,4,5,6,7,8,9,10);
Называется оператор splat
. Вы можете сделать это в JavaScript, используя apply
:
var arr = ['a','b','c','d'];
var func = function() {
// debug
console.log(arguments.length);
console.log(arguments);
}
func('a','b','c','d'); // prints 4 which is what I want, then 'a','b','c','d'
func(arr); // prints 1, then 'Array'
func.apply(null, arr);
Функция apply
принимает два аргумента; объект this
привязывается к, а аргументы представляются в виде массива.
some_func = function (a, b) { return b }
some_func.apply(obj, ["arguments", "are", "here"])
// "are"