这是另一个Javascript闭包问题。我一加载文档就运行以下代码:
var handlers = (function () {
var clickHandler = function() { alert ('click!'); }
return {
clickHandler : clickHandler
}
}());
$('#element').addEventListener('click', handlers.clickHandler);
然后在稍后我想替换处理程序的功能,从而执行以下操作:
handlers.clickHandler = function() { alert ('changed handler!'); }
根据我对Javascript闭包的理解,事件监听器应该保留clickHandler函数的引用,因此功能应该相应地改变。然而,这不是发生的事情。事件侦听器触发初始函数。我已经设法使用eval
实现了我想要的结果,但这感觉就像一个黑客。是否有合法的方式来做我想要的事情?
答案 0 :(得分:1)
$('#element').on('click', /*the solution: */ () => handlers.clickHandler());
您需要在执行处理程序时解析标识符,而不是在注册时解析。这可以通过将调用包装到函数中来完成,就像我上面所做的那样(使用箭头函数)。