我正在尝试学习有关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);
理想情况下,答案是正确的,这样我就可以将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);
这既是一个特定的问题,又是一个一般的理论问题。我将使用答案,但也希望理解,以便将来扩展知识并使用此概念。
非常感谢:)
答案 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);