如何更改闭包中捕获的函数定义

时间:2017-11-06 20:30:05

标签: javascript closures

这是另一个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实现了我想要的结果,但这感觉就像一个黑客。是否有合法的方式来做我想要的事情?

1 个答案:

答案 0 :(得分:1)

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

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