首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何不使用apply来实现Function.prototype.apply?

如何不使用apply来实现Function.prototype.apply?
EN

Stack Overflow用户
提问于 2015-12-19 08:41:02
回答 3查看 141关注 0票数 0
代码语言:javascript
运行
复制
function sumArguments () {
  var value = this instanceof Number ? this : 0;
  for (var i = 0; i < arguments.length; i++) {
    value += arguments[i];
  }
  return value;
}

Function.prototype.apply1 = function() {
  var fn = this;
  var args = Array.prototype.slice.call(arguments);
  var context = args.shift();
  var newArgs = args[0];

  var boundfn = fn.bind(context, newArgs);

  return boundfn();
}

console.log(sumArguments.apply1(4, [1, 2, 3])); --> should equal 10

如何在不使用apply的情况下应用实现?我遇到了如何将1,2,3的数组转换为要绑定的1,2,3的问题。

EN

回答 3

Stack Overflow用户

发布于 2015-12-19 09:01:02

我能想到的唯一方法就是使用eval

代码语言:javascript
运行
复制
function apply(fn, args){
  var stringArgs = args.reduce(function(acc, el, i){
    var argString = 'args[' + i + ']';
    return acc += i === 0 ? argString : ',' + argString; 
  });
  return eval('fn(' + stringArgs + ')');
}
       
function test(first, second, third){
    console.log(first, second, third);
}

apply(test, [1, 2, 3]);

不过,我不明白你为什么需要这个。这也不适用于许多数据类型,如对象或字符串。不过,它确实适用于数字。

编辑:现在它适用于任何数据类型。

票数 1
EN

Stack Overflow用户

发布于 2015-12-19 09:25:34

这里的目标是使用上下文和提供的参数调用fn.bind,对吗?

如果您使用的是ES6,则扩展运算符...就是您想要的:

代码语言:javascript
运行
复制
foo(...[1,3,5]); //equivalent to foo(1, 3, 5)

fn.bind(context, ...args);

否则,您可以在bind上调用apply

代码语言:javascript
运行
复制
fn.bind.apply(fn, [context].concat(args));

fn作为fn.bind的上下文传递将保持其正常行为,并且您需要组合要传递的所有参数以绑定到单个数组中,因此需要进行连接。

票数 1
EN

Stack Overflow用户

发布于 2015-12-19 09:17:59

我不确定为什么需要使用apply,但这里的sum函数可以满足您的需求。它应该能够处理许多内部数组并忽略对象。

代码语言:javascript
运行
复制
function sumArguments() {
    var value = this instanceof Number ? this : 0;
    for (var i = 0; i < arguments.length; i++) {
        if (typeof arguments[i] === 'number') {
            value += arguments[i];
        } else if (typeof arguments[i] === 'object' &&
                   typeof arguments[i].length !== 'undefined') {
            for (var j = 0; j < arguments[i].length; j++) {
                if (typeof arguments[i][j] === 'number') {
                    value += arguments[i][j];
                } else if (typeof arguments[i][j] === 'object' &&
                           typeof arguments[i][j].length !== 'undefined') {
                    value += sumArguments(arguments[i][j]);
                }
            }
        }
    }
    return value;
}

console.log(sumArguments(4, [1, 2, 3, [7, 8]], 5, 'a', 2));
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34366035

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档