我最近一直在使用 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)方法,而不必再担心它。
谁能告诉我为什么这是一个坏主意或者为什么不应该这样做?我确信这是一个愚蠢的问题,但我找不到有关该主题的任何资源。提前致谢!
最佳答案
在我的脑海中,有四种方法可以解决只允许调用一次函数的问题
- 使用 bool 标志来标记函数已执行(在原始帖子中提到)。该技术与语言无关。如果其他函数依赖于必须首先运行的
init()
函数,您将特别需要使用此函数。 - 使用下划线的once创建只能运行一次的函数。这样做的优点是,如果不需要,则不会创建 bool 值。
- 通过删除来修改该函数(在原始帖子中提到)。这可行,但似乎是个坏主意。您的
init()
调用者必须跟踪init()
是否已被调用,以避免空引用错误。 - 修改函数,将其替换为 noop。这与使用 Underscore 的优点和缺点完全相同。所以,而不是
删除this.init
做
this.init = function(){};
因此,在我看来,1、2、4 是 JavaScript 中不错的选择。
关于javascript - 使用一次后删除 Javascript 模块中的公共(public)方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25794268/