gpt4 book ai didi

javascript - 在 JavaScript 中调用具有可变数量参数的函数(类似于 call())

转载 作者:行者123 更新时间:2023-11-30 06:26:37 26 4
gpt4 key购买 nike

我熟悉的方式call() ,您可以传递可变数量的参数,这些参数将在调用时加载到函数的参数中。我正在尝试做一些相关的事情,我使用 forEach 递归 RaphaelJS 中的嵌套集合对象。 (类似于 jQuery 的 each ),确定子元素是否是另一个集合,如果不是,则应用参数数量可变的函数。我想使其通用,以便我可以应用任何函数,但使我传递的函数具有简单的参数构造函数,而无需访问函数的 arguments 属性。

function recursiveFncApply(set, fnc, args) {
set.forEach(function(item) {
if (item.type == 'set') {
recurseApplyFncToSets(item, fnc, args);
} else {
fnc(item, args);
}
});
}

function translateOperation(element, operation, x, y)
// do stuff to element with operation, x, and y args without accessing
// accessing arguments property
}

recursiveFncApply(passedSet, translateOperation, [arg1, [arg2, ...]]);

我想这样做,这样我就可以使用多个函数,而不必重复确定参数并在使用前正确分配它们的代码。我不确定是否缺少某种功能或语言实用程序使我能够执行此操作,或者以某种方式通过传递给 recursiveFncApply 的其余参数以编程方式“构造”函数调用。这在 JavaScript 中可能吗?

澄清:我想将可变数量的参数传递给我的递归函数,这些参数将传递给任何我想应用于我的递归函数正在处理的集合内容的函数。因此,我希望能够使 recursiveFncApply 一般适用于任何函数,同时仍然使用一个参数结构,该参数结构的工作方式类似于通过 call() 执行的函数。

假设我除了 translateOperation 之外还有另一个函数:

function anotherFunction(element, differentArg) {
// do something with one argument
}

理想情况下,我可以这样使用我的 recursiveFncApply:

recursiveFncApply(passedSet, translateOperation, operation, x, y);
recursiveFncApply(passedSet, anotherFunction, singleArg);

还有这种方式:

recursiveFncApply(passedSet, anotherFunction, singleArg);

我相信这与 call() 的工作方式类似,因为我可以这样做:

anotherFunction.call(this, element, differentArg);

.. 无需更改 anotherFunction 的结构来整理 arguments 属性,或传递对象/数组。

最佳答案

事实证明,Felix King 的想法是正确的/是最接近的。当我意识到我实际想要做的事情时,我找到了我的问题的直接答案,即将参数从一个函数传递到另一个函数(找到答案 here )。所以我得到了这个与这段代码一起工作:

function recursiveSetFncApply(set, fnc/*, variable */) {
var me = this;
var parentArgs = arguments;
set.forEach(function(element) {
if (element.type == 'set') {
parentArgs[0] = element;
me._recursiveSetFncApply.apply(me, parentArgs);
} else {
// Generate args from optional arguments and pass forward; put element in args at front
var args = Array.prototype.slice.call(parentArgs, 2);
args.unshift(element);
fnc.apply(element, args);
}
});
}

我使用 parentArgs 引用了 arguments 因为我需要在 arguments 之前更新 set 属性我将它传递给下一个递归循环,否则我会进入无限循环,因为它根本没有更新,因为它使用的是原始参数集。我的印象是 apply() 实际上不会传递前向参数,而只是将一个数组弹出到您必须通过索引访问的新函数中——事实并非如此。当我在 translateElementOperation 上使用 apply() 时,我在它们的确切位置获得了我需要的所有参数。这是我通过递归应用运行的更新函数:

function translateElementOperation(element, operation, x, y) {
var currentPath = element.attr('path');
translatedPath = Raphael.transformPath(currentPath, [operation, x, y]);
element.attr('path', translatedPath);
}

谢谢大家的帮助!

关于javascript - 在 JavaScript 中调用具有可变数量参数的函数(类似于 call()),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20690025/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com