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

标签 javascript

我熟悉的方式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/

相关文章:

javascript - JS 模式提供函数名称作为字符串

javascript - this.getView() 在事件回调后返回 undefined

javascript - 单击滚动条按钮时如何控制 Firefox 中的滚动增量?

javascript - 将我的侧边栏菜单更改为用于移动 View 和较小屏幕的按钮

javascript - ReactJS 在多个组件之间保持单个 "Active"状态

javascript - 数字比较在 jquery 中不起作用

javascript - 在多个页面上平滑滚动导航

javascript - 如何使 AJAX 调用挂起

javascript - html 上未捕获的语法错误

javascript - 单击时滚动到排队的 div