Answers:
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 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);
}
答案已经给出了,但我只想小菜一碟。您想要实现的目标是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
天啊。不幸的是,这行不通。因为我们正在调用hash(arguments)和arguments对象,所以它既可迭代又类似于数组,但不是真正的数组。下面的方法怎么样?
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.
因此,从技术上讲,它需要把this [0],this [1]…etc连接在一起。它是故意以允许像这样的任何数组的方式编写的(不是巧合,很多方法都遵循这种做法)。这就是为什么它也可以与this=arguments.