这是另一个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达到了想要的结果,但是这感觉像是一个hack。有合法的方法做我想做的事吗?

最佳答案

$('#element').on('click', /*the solution: */ () => handlers.clickHandler());


您需要在执行处理程序而不是注册时解析标识符。可以通过将调用包装到一个函数中来完成,就像我上面所做的那样(使用箭头函数)。

10-04 15:40