如何理解 restArgs 这个函数的作用?

发布于 2022-09-02 19:51:12 字数 1058 浏览 15 评论 0

var restArgs = function(func, startIndex) {
  startIndex = startIndex == null ? func.length - 1 : +startIndex;
  return function() {
    var length = Math.max(arguments.length - startIndex, 0);
    var rest = Array(length);
    for (var index = 0; index < length; index++) {
      rest[index] = arguments[index + startIndex];
    }
    switch (startIndex) {
      case 0: return func.call(this, rest);
      case 1: return func.call(this, arguments[0], rest);
      case 2: return func.call(this, arguments[0], arguments[1], rest);
    }
    var args = Array(startIndex + 1);
    for (index = 0; index < startIndex; index++) {
      args[index] = arguments[index];
    }
    args[startIndex] = rest;
    return func.apply(this, args);
  };
};

var delay = restArgs(function(func, wait, args) {
  return setTimeout(function(){
    return func.apply(null, args);
  }, wait);
});

var sayHi = function(){
    console.log("Hello");
}
delay(sayHi, 200, 1, 2, 3);

另外: 为什么 restArgs 的返回函数中 arguments 的值是 [sayHi, 200, 1, 2, 3] ?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

东风软 2022-09-09 19:51:12

restArgs接受一个函数fn1和startIndex,返回另一个函数fn2
把调用fn2时传入的参数从startIndex开始封装成一个数组,然后调用fn1

例如startIndex = 1的话
fn2(a, b, c)就相当于fn1(a, array),其中array = [b,c]

function foo(a, b, c) {}
delay(foo, 1000, d, e, f);
就相当于
setTimeout(function () {
    foo(d, e, f);
}, 1000);
口干舌燥 2022-09-09 19:51:12
function restArg(func1){ 
    return function(){
        func1.apply(this, Array.prototype.slice(arguments, 1));
    }; 
}

restArgs返回了一个匿名函数

delay(sayHi,200,2,3);

在调用delay时传入了额外的arguments,返回的匿名函数对额外的参数做了处理,再调用传入的函数sayHi。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文