Відповіді:
const args = ['p0', 'p1', 'p2'];
call_me.apply(this, args);
Див. Документи MDN для Function.prototype.apply()
.
Якщо середовище підтримує ECMAScript 6, ви можете замість цього використовувати аргумент :
call_me(...args);
Чому ти не передаєш весь масив і не обробиш його за потребою всередині функції?
var x = [ 'p0', 'p1', 'p2' ];
call_me(x);
function call_me(params) {
for (i=0; i<params.length; i++) {
alert(params[i])
}
}
call_me
функції. Просто не вистачає крапки з комою в кінці.
У стандарті ES6 є новий оператор розповсюдження, ...
який робить саме це.
call_me(...x)
Його підтримують усі основні браузери, крім IE.
Оператор розповсюдження може зробити багато інших корисних речей, а пов'язана документація справді добре справляється з цим.
Як відповів @KaptajnKold
var x = [ 'p0', 'p1', 'p2' ];
call_me.apply(this, x);
І вам також не потрібно визначати всі параметри функції call_me. Можна просто використовуватиarguments
function call_me () {
// arguments is a array consisting of params.
// arguments[0] == 'p0',
// arguments[1] == 'p1',
// arguments[2] == 'p2'
}
Зверніть увагу на це
function FollowMouse() {
for(var i=0; i< arguments.length; i++) {
arguments[i].style.top = event.clientY+"px";
arguments[i].style.left = event.clientX+"px";
}
};
// ---------------------------
html-сторінка
<body onmousemove="FollowMouse(d1,d2,d3)">
<p><div id="d1" style="position: absolute;">Follow1</div></p>
<div id="d2" style="position: absolute;"><p>Follow2</p></div>
<div id="d3" style="position: absolute;"><p>Follow3</p></div>
</body>
може викликати функцію з будь-якими Args
<body onmousemove="FollowMouse(d1,d2)">
або
<body onmousemove="FollowMouse(d1)">
function foo([a,b,c], d){
console.log(a,b,c,d);
}
foo([1,2,3], 4)
function foo(a, b, c, d){
console.log(a, b, c, d);
}
foo(...[1, 2, 3], 4)
Під час використання оператора спред слід зазначити, що він повинен бути останнім або єдиним пройденим параметром. Інакше це не вдасться.
function callMe(...arr){ //valid arguments
alert(arr);
}
function callMe(name, ...arr){ //valid arguments
alert(arr);
}
function callMe(...arr, name){ //invalid arguments
alert(arr);
}
Якщо вам потрібно передати масив як вихідний аргумент, ви можете зробити:
function callMe(arr, name){
let newArr = [...arr];
alert(newArr);
}
ви можете використовувати оператор розповсюдження в більш базовій формі
[].concat(...array)
у випадку функцій, які повертають масиви, але, як очікується, передаються як аргументи
Приклад:
function expectArguments(...args){
return [].concat(...args);
}
JSON.stringify(expectArguments(1,2,3)) === JSON.stringify(expectArguments([1,2,3]))
Відповідь вже була дана, але я просто хочу дати свій шматок пирога. Те, що ви хочете досягти, називається method borrowing
в контексті JS, що коли ми беремо метод з об'єкта і називаємо його в контексті іншого об'єкта. Досить звичайно приймати методи масиву і застосовувати їх до аргументів. Дозвольте навести вам приклад.
Отже, у нас є "супер" хеш-функція, яка бере два числа як аргумент і повертає хеш-рядок "супер безпечного":
function hash() {
return arguments[0]+','+arguments[1];
}
hash(1,2); // "1,2" whoaa
Поки що добре, але у нас мало проблем з вищезазначеним підходом, він обмежений, працює лише з двома числами, це не динамічно, давайте змусимо його працювати з будь-яким числом і плюс вам не потрібно передавати масив (ви можете якщо ви все-таки наполягаєте). Гаразд, достатньо поговорити, будемо битися!
Природним рішенням буде використання arr.join
методу:
function hash() {
return arguments.join();
}
hash(1,2,4,..); // Error: arguments.join is not a function
О, чоловіче. На жаль, це не вийде. Оскільки ми називаємо хеш (аргументи) і об'єкт аргументів є ітерабельним і подібним до масиву, але не є реальним масивом. Як щодо нижченаведеного підходу?
function hash() {
return [].join.call(arguments);
}
hash(1,2,3,4); // "1,2,3,4" whoaa
Трюк називається method borrowing.
Ми запозичаємо join
метод із звичайного масиву [].join.
та використовуємо [].join.call
для запуску в контексті arguments
.
Чому це працює?
Це тому, що внутрішній алгоритм нативного методу arr.join(glue)
дуже простий.
З специфікації майже «як є»:
Let glue be the first argument or, if no arguments, then a comma ",".
Let result be an empty string.
Append this[0] to result.
Append glue and this[1].
Append glue and this[2].
…Do so until this.length items are glued.
Return result.
Таким чином, технічно він приймає це і приєднується до цього [0], цього [1]… і т.д. разом. Це навмисно написано так, що дозволяє будь-який подібний масив (не випадковість, багато методів слідують цій практиці). Ось чому це теж працюєthis=arguments.