我已经尝试了以下方法,但均未成功:
function a(args){
b(arguments);
}
function b(args){
// arguments are lost?
}
a(1,2,3);
在函数a中,我可以使用arguments关键字来访问参数数组,而在函数b中,这些参数将丢失。有没有办法像我尝试的那样将参数传递给另一个javascript函数?
我已经尝试了以下方法,但均未成功:
function a(args){
b(arguments);
}
function b(args){
// arguments are lost?
}
a(1,2,3);
在函数a中,我可以使用arguments关键字来访问参数数组,而在函数b中,这些参数将丢失。有没有办法像我尝试的那样将参数传递给另一个javascript函数?
Answers:
用于.apply()
对arguments
in函数具有相同的访问权b
,如下所示:
function a(){
b.apply(null, arguments);
}
function b(){
alert(arguments); //arguments[0] = 1, etc
}
a(1,2,3);
var copy = [].slice.call(arguments); <remove what you want> myFunc.apply(this, copy);
apply
像这样使用可能会破坏范围b
(例如,如果它是对象的某些内部功能)
扩展运算符允许在需要多个参数(用于函数调用)或多个元素(用于数组文字)的位置扩展表达式。
ECMAScript ES6添加了一个新的运算符,可让您以更实际的方式执行此操作:... Spread Operator。
不使用该apply
方法的示例:
function a(...args){
b(...args);
b(6, ...args, 8) // You can even add more elements
}
function b(){
console.log(arguments)
}
a(1, 2, 3)
Note 如果您的浏览器仍使用ES5,则此代码段返回语法错误。
编者注:由于该片段使用console.log()
,因此必须打开浏览器的JS控制台才能看到结果 - 没有页面内结果。
它将显示以下结果:
简而言之,如果您使用数组,那么散布运算符可以用于不同的目的,因此它也可以用于函数参数,您可以看到官方文档中介绍的类似示例:Rest参数
...args
该a
功能。你可以只是做一个函数不带任何参数,并把它们交给b
同...arguments
...args
为a
的输入可能很重要。
的解释,没有任何其他的答案用品的是,原来的参数是仍然可用,但不是在原来的位置arguments
的对象。
arguments
对于提供给函数的每个实际参数,该对象包含一个元素。当你调用a
你提供三个参数:编号1
,2
和,3
。因此,arguments
包含[1, 2, 3]
。
function a(args){
console.log(arguments) // [1, 2, 3]
b(arguments);
}
b
但是,当您调用时,您只传递了一个参数:a
的arguments
对象。So arguments
contains [[1, 2, 3]]
(即一个元素,它是a
的arguments
对象,其属性包含的原始参数a
)。
function b(args){
// arguments are lost?
console.log(arguments) // [[1, 2, 3]]
}
a(1,2,3);
正如@Nick演示的那样,您可以用来在调用中apply
提供一个设置arguments
对象。
以下实现相同的结果:
function a(args){
b(arguments[0], arguments[1], arguments[2]); // three arguments
}
但是apply
在一般情况下是正确的解决方案。
this
到apply
?
尝试这个
function global_func(...args){
for(let i of args){
console.log(i)
}
}
global_func('task_name', 'action', [{x: 'x'},{x: 'x'}], {x: 'x'}, ['x1','x2'], 1, null, undefined, false, true)
//task_name
//action
//(2) [{...},
// {...}]
// {
// x:"x"
// }
//(2) [
// "x1",
// "x2"
// ]
//1
//null
//undefined
//false
//true
//func
arguments
它实际上不是数组(而是一个实现类似数组的语义的对象),因此乍一看尚不清楚它是否可以与实际数组相同的方式使用。