Javascript高阶函数,调用带有n个参数的函数

时间:2018-07-15 19:49:17

标签: javascript higher-order-functions

我正在尝试学习有关curring的信息。也许这不是做到这一点的方法,所以请接受任何优雅且实用的答案。

基本上,我有一些经常重复使用的代码,使函数在页面加载时运行,并且可以在浏览器中运行:

const xOnLoadify = (fn) => {
  if (window.attachEvent) { window.attachEvent('onload', fn); }
  else if (window.addEventListener) { window.addEventListener('load', fn, false); }
  else { document.addEventListener('load', fn, false); }
};

但是,使用此xOnLoadify函数,我只能使用默认参数来调用它。我该如何修改它,以便可以将任意数量的参数传递给任何fn函数?

我尝试过类似的事情:

const xOnLoadify = () => (fn) => {
  if (window.attachEvent) { window.attachEvent('onload', fn); }
  else if (window.addEventListener) { window.addEventListener('load', fn, false); }
  else { document.addEventListener('load', fn, false); }
};

但是我不知道如何在不立即调用fn fn(args);

的情况下将参数放入fn

理想情况下,答案是正确的,这样我就可以将xOnLoadify与传入的fn格式化的任意数量的参数一起使用。

Ex;

    function myNiftyFunction(arg1='default1', arg2='default2', arg3='default3') {
      // don't want the args to be these defaults
      console.log(arg1, arg2, arg3);
    } 

然后像xOnLoadify(myNiftyFunction)(arg1,arg2,arg3);

这既是一个特定的问题,又是一个一般的理论问题。我将使用答案,但也希望理解,以便将来扩展知识并使用此概念。

非常感谢:)

2 个答案:

答案 0 :(得分:1)

您可以通过currying获取一个传播参数,然后绑定该函数:

const xOnLoadify = (fn) => (...args) => {
  fn = fn.bind(this, ...args); // bind arguments to the function
  if (window.attachEvent) { window.attachEvent('onload', fn); }
  else if (window.addEventListener) { window.addEventListener('load', fn, false); }
  else { document.addEventListener('load', fn, false); }
};

然后您可以将其称为:

xOnLoadify(myNiftyFunction)(arg1,arg2,arg3);

答案 1 :(得分:0)

我认为您的追求是bind,..

这是一个简单的例子。

function callthis(a,b,c) {
  console.log(`a=${a}, b=${b}, c=${c}`);
}

function test(fn, ...args) {
  const fncall = fn.bind(null, ...args);
  fncall();
}

test(callthis, 1, 2, 3);