【问题标题】:Re: A JavaScript Fn that accepts unknown # args - call Fn wrks - call via var does not回复:接受未知 # args 的 JavaScript Fn - 调用 Fn wrks - 通过 var 调用不
【发布时间】:2016-12-13 10:36:10
【问题描述】:

学习如何编写接受未知数量参数的 JS Fn。

function foo(a,b,c,d){
    //do something
    //return something
}

var bar = function () {
    var arg = Array.from(arguments);
    var lastIndx = arg.length;
    var parArray = arg.slice(1,lastIndx);
    var argMnts = arguments[0];
    return arguments[0].apply(this, parArray);
};

调用栏因此有效:

bar(foo,1,4,3,7);

这样称呼它:

var tester = bar(foo,1,4,3,7);
tester();

导致:tester 不是函数

根据我的研究,我怀疑它可能与“this”或参数的范围有关,因此我将它们的值分配给变量,替换变量,结果是相同的。

我们将不胜感激。

【问题讨论】:

    标签: javascript function arguments this apply


    【解决方案1】:

    在您的示例中,调用 bar() 返回调用 foo(...) 的任何结果。因此,如果您希望能够做到这一点:

    var tester = bar(foo,1,4,3,7);
    tester();
    

    然后,foo(...) 必须返回另一个可以分配给tester 的函数,然后可以再次调用。


    如果您不希望bar(foo, ...) 实际调用foo(),而不是上面的方式,而是希望它返回一个函数,然后使用适当的参数调用foo(),您可以将bar() 更改为:

    var bar = function () {
        var args = Array.from(arguments);
        var fn = args.shift();
        var self = this;
        return function() {
            return fn.apply(self, args);
        }
    };
    
    var tester = bar(foo,1,4,3,7);
    tester();
    

    这里,bar() 返回一个函数,该函数(调用时)将调用 foo()


    或者,在正确的 ES6 支持下,您可以使用剩余参数;

    var bar = function (fn, ...args) {
        var self = this;
        return function() {
            return fn.apply(self, args);
        }
    };
    

    或者,您可以将 .bind() 与其余参数和扩展运算符一起使用:

    var bar = function (fn, ...args) {
        return fn.bind(this, ...args);
    };
    

    【讨论】:

    • Array.from 来自 ES6,所以我认为假设他们正在使用它是安全的。
    • @4castle - ES6 支持并不总是出现在一个巨大的整体中,你拥有或没有任何一个。例如,节点 4.x 有Array.from(),但没有休息或传播。节点 5.x 有 Array.from() 并传播,但没有休息。节点 6.x 拥有这三个。无论如何,我的回答现在提供了几种选择。
    • 我从中学到了很多谢谢!关于您的回答: return fn.apply(self, args); fn 不需要引用 args [] 的第一个索引,并且 args 被替换为包含除第一个索引之外的所有索引的 [] 吗?
    • @InaMastabba - 这就是args.shift() 所做的。 args.shift()args 数组中获取第一项,其他项在数组中向下移动。因此,您将fn 作为第一个参数,将args 作为其余参数。
    猜你喜欢
    • 2010-09-23
    • 2012-07-17
    • 1970-01-01
    • 1970-01-01
    • 2021-08-19
    • 1970-01-01
    • 2017-05-25
    相关资源
    最近更新 更多