首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Javascript怪异变量在事件函数中变为空

Javascript怪异变量在事件函数中变为空
EN

Stack Overflow用户
提问于 2017-11-27 22:09:21
回答 1查看 229关注 0票数 0

我在js里看到了一些奇怪的东西。以下是案例研究:

代码语言:javascript
复制
var openModal = function() {

    ...

    var pgwSlider = $('.initPgwSlider').pgwSlider();

    $('#bootstrap-modal').on('shown.bs.modal', function () {
        pgwSlider.reload();
    });
    $('#bootstrap-modal').on('hidden.bs.modal', function () {
        pgwSlider.destroy();
        pgwSlider = null;
    });

    $('#bootstrap-modal').model({
        show: true
    });

}

当我第一次调用openModal()时,这是很好的。

但我第二次打电话给openModal()..。我得到pgwSlider为null,在这里:

代码语言:javascript
复制
    pgwSlider.reload();

这不应该在正常情况下发生,因为整个函数openModal()都是执行的,这意味着再次实例化pgwSlider

这是某种记忆泄露吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-28 02:43:41

问题是,每次调用openModal时,都会将事件侦听器附加到'shown.bs.modal''hidden.bs.modal',因此,第二次openModal再次运行和打开相同的模式时,会触发2次'shown.bs.modal':一次用于第一个附件,一次用于当前附件;但第一个pgwSlider现在是null,正如第一个'shown.bs.modal'中声明的那样

您可以通过两种方式避免这种情况:

使用.one只向事件http://api.jquery.com/one/附加一次,因此它只触发一次事件侦听器。

代码语言:javascript
复制
$('#bootstrap-modal').one('shown.bs.modal' ...
$('#bootstrap-modal').one('hidden.bs.modal' ...

或者使用.off http://api.jquery.com/off/分离关闭模式上的侦听器(因为在引导时只能有一个模式)

代码语言:javascript
复制
$('#bootstrap-modal').on('hidden.bs.modal', function () {
    pgwSlider.destroy();
    pgwSlider = null;
    $('#bootstrap-modal').off('hidden.bs.modal')
    $('#bootstrap-modal').off('shown.bs.modal')
});

关于内存泄漏:这是某种类型的内存泄漏,但是稍后您可以清除被遗忘的侦听器

代码语言:javascript
复制
$('#bootstrap-modal').off('hidden.bs.modal')
$('#bootstrap-modal').off('shown.bs.modal')
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47520674

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档