javascript - 使用一次后删除 Javascript 模块中的公共(public)方法?

标签 javascript jquery module

我最近一直在使用 Javascript 模块模式,所有这些对我来说都非常清楚,除了一件事:防止公共(public)方法被多次调用。

例如,我可能有一些在页面加载时运行的 JavaScript,它是模块上的公共(public)方法,用于设置按钮和操作,以及确定元素的可见性等。我不希望有人能够第二次调用该代码,因为它可能会破坏页面的预期外观和功能,坦率地说,我想不出为什么我希望任何人在第一次调用后都知道该方法存在。

实现此功能的一种方法是使用一个私有(private) bool 值来跟踪这些公共(public)方法是否被调用,然后在下次调用时,放弃而不是执行。这在每种编程语言中都相当常见,并且可以如下所示完成。

var Module = (function() {
    var _showHelloWorld = function() {
        jQuery('div').text('Hello World!');
    },

    _init = function() {
        if (_initCalled) {
            console.log('Init was already called!');
            return;
        }

        _showHelloWorld();

        _initCalled = true;
    },

    _initCalled = false;

    return {
        init : _init
    };
})();

jQuery(function() {
    Module.init();

    // This will not break, it will log that init was called already and bail!
    Module.init();
});

但是,公共(public)函数仍然处于这种情况,即使将来对该方法的调用实际上不会执行任何操作,该方法仍然存在,供人们查看是否在控制台中进行挖掘等。

我的问题的根源是,为什么不在调用这些类型的公共(public)方法后从模块中删除它们呢?我们有什么理由不想这样做吗?我尝试在网上搜索有关此类情况的讨论,但没有找到与该主题相关的任何内容。下面的代码试图解释我的想法:

var Module = (function() { 
    var _showHelloWorld = function() {
        jQuery('div').text('Hello World!');
    },

    _init = function() {
        _showHelloWorld();

        // LOOK HERE!
        delete this.init;
        // LOOK HERE!
    };

    return {
        init : _init
    };
})();

jQuery(function() {
    Module.init();

    // THIS IS GOING TO BREAK!
    Module.init();
});

第一次调用 init 方法后,我们可以删除公共(public)方法,而不必再担心它。

谁能告诉我为什么这是一个坏主意或者为什么不应该这样做?我确信这是一个愚蠢的问题,但我找不到有关该主题的任何资源。提前致谢!

最佳答案

在我的脑海中,有四种方法可以解决只允许调用一次函数的问题

  1. 使用 bool 标志来标记函数已执行(在原始帖子中提到)。该技术与语言无关。如果其他函数依赖于必须首先运行的 init() 函数,您将特别需要使用此函数。
  2. 使用下划线的once创建只能运行一次的函数。这样做的优点是,如果不需要,则不会创建 bool 值。
  3. 通过删除来修改该函数(在原始帖子中提到)。这可行,但似乎是个坏主意。您的 init() 调用者必须跟踪 init() 是否已被调用,以避免空引用错误。
  4. 修改函数,将其替换为 noop。这与使用 Underscore 的优点和缺点完全相同。所以,而不是 删除this.init

this.init = function(){};

因此,在我看来,1、2、4 是 JavaScript 中不错的选择。

关于javascript - 使用一次后删除 Javascript 模块中的公共(public)方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25794268/

相关文章:

javascript - 在响应式 JQuery/CSS 菜单中显示子项

android - :active not working on phonegap

c - Linux 内核模块在迭代正在运行的进程以访问进程打开的文件时卡住计算机

javascript - 将 Moment utc 时间转换为 unix 时间

Javascript 在 Chrome Extension 中并不总是有效,我应该什么时候运行它?

javascript - 为什么 JQuery Datepicker 出现故障?

python - 初学者 Python 导入模块

javascript - 如何防止 IFRAME 重定向顶级窗口

javascript - 如何使用 jquery 调整 html 表的行和列的大小?

module - verilog 看不到我的功能