我正在玩bind
call
和apply
。我试图通过将从一个函数返回的任何内容传递给该对象上的方法来更新对象的属性。
此更新附加到window
resize事件。
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
函数。它只是传递从一开始就返回的内容。
有解决方法吗?
我觉得currying会解决这个问题吗?但不确定如何在这种情况下实施。
答案 0 :(得分:0)
您不是在寻找currying,而是composition(以及您已经在做的partial application来自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));