函数式编程问题是JS

Functional programming issue is JS

本文关键字:JS 问题是 编程 函数      更新时间:2023-09-26

我在玩bind callapply。我正在尝试通过将从一个函数返回的任何内容传递给该对象上的方法来更新对象的属性。

此更新附加到 window 调整大小事件。

var el = document.getElementById('someElement');
var resolveLeft = function(element) {  
  return element.offsetLeft;
};
var someObject = {
  setDefaultLeft: function(value) {
    this.defaultLeft = value;
    console.log(this.defaultLeft);
  }
};
// this works
window.addEventListener('resize', function() {
  someObject.setDefaultLeft(resolveLeft(el));
});
// this one doesn't
window.addEventListener('resize', someObject.setDefaultLeft.bind(someObject, resolveLeft(el)));
#someElement {
  position: absolute;
  left: 10%;
}
<div id="someElement"></div>

我有 2 个事件绑定。第一个在每次调整窗口大小时记录更新的值,而第二个仅记录返回的初始值。

我意识到在第二种情况下,该值已经从resolveLeft返回,并且它不会再次revisit(可以这么说)resolveLeft函数。它只是传递从一开始就返回的任何内容。

有解决方法吗?

我有一种感觉,咖喱可以解决这个问题吗?但不确定在这种情况下如何实现。

你不是在寻找咖喱,而是在寻找组合(连同你已经在做的通过bind的部分应用):

function compose(f, g) {
    return x => f(g(x));
}
var set = someObject.setDefaultLeft.bind(someObject);
window.addEventListener('resize', compose(set, resolveLeft).bind(null, el));