将参数传递给另一个 javascript 函数

IT技术 javascript
2021-02-08 04:53:16

我尝试了以下方法但没有成功:

function a(args){
    b(arguments);
}

function b(args){
    // arguments are lost?
}

a(1,2,3);

在函数a中,我可以使用arguments关键字来访问参数数组,在函数b中这些都丢失了。有没有办法像我尝试做的那样将参数传递给另一个 javascript 函数?

4个回答

用于.apply()argumentsin 函数具有相同的访问权限b,如下所示:

console.log = function(x) { document.write(x === undefined ? undefined : JSON.stringify(x) + "<br />"); };

function a(){
    b.apply(null, arguments);
}
function b(){
    console.log(arguments); //arguments[0] = 1, etc
}
a(1,2,3);

你可以在这里测试一下

但是随后“this”可能会更改为 b 的原始 this 以外的其他内容。
2021-03-23 04:53:16
@vsync 好点,但问题很容易解决:将对象作为第一个参数传递给应用程序。
2021-03-24 04:53:16
@Brett - 您可以将它复制到一个数组中,然后在传递它之前对其进行操作,例如: var copy = [].slice.call(arguments); <remove what you want> myFunc.apply(this, copy);
2021-03-28 04:53:16
一起使用“args”和“arguments”是没有意义的......
2021-03-29 04:53:16
但是apply像这样使用可能会破坏范围b(例如,如果它是对象的某些内部功能)
2021-04-02 04:53:16

展开运算符

展开运算符允许在需要多个参数(用于函数调用)或多个元素(用于数组文字)的地方扩展表达式。

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 parameters

你不需要...argsa函数中。您可以创建一个没有参数的函数并将它们传递给bwith...arguments
2021-03-13 04:53:16
这是一个非常好的运算符,我真的很期待使用它。然而,它还不会发生。目前唯一支持扩展运算符的浏览器是 FF。有关完整的最新数据,请参阅兼容性表:kangax.github.io/compat-table/es6/#spread_%28...%29_operator
2021-03-20 04:53:16
对于阅读此答案的任何人:与@cronoklee 的评论相反,如果您有嵌套函数,明确指定...argsasa的输入可能很重要。
2021-03-31 04:53:16
这比第一个解决方案更好,因为它适用于使用箭头运算符定义的函数。
2021-04-02 04:53:16
为什么不应该使用它?使用 babel 进行转译相对容易,您可以获得所有新功能,以及与旧浏览器的更多兼容性。
2021-04-03 04:53:16

的解释,没有任何其他的答案用品的是,原来的参数仍然可用,但不是在原来的位置arguments的对象。

arguments对于提供给函数的每个实际参数对象包含一个元素。当您打电话时,您需要a提供三个参数:数字12、 和3所以,arguments包含[1, 2, 3].

function a(args){
    console.log(arguments) // [1, 2, 3]
    b(arguments);
}

b但是,当您调用时,您只传递了一个参数:aarguments对象。所以arguments包含[[1, 2, 3]](即一个元素,它是aarguments对象,它的属性包含到 的原始参数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在一般情况下是正确的解决方案。

你应该总是传递thisapply?
2021-03-13 04:53:16
@Flimm-是的,因为参数是第二个参数,所以第一个参数必须有一些东西(它可以是null)。
2021-04-04 04:53:16

如果你只想传递某些参数,你可以这样做:

Foo.bar(TheClass, 'theMethod', 'arg1', 'arg2')

Foo.js

bar (obj, method, ...args) {
  obj[method](...args)
}

objmethodbar()方法使用,而其余的参数则传递给实际调用。