Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

没有 Promise 也要确保只执行一次

  Promise 的一个特点是 resolve 无论被执行多少次只有第一次会生效,之后的执行都会被无视掉。有时候一些函数确实也需要避免重复执行,在没有 Promise 的环境下,如何防止一个函数多次执行呢?方法有很多,可以根据不同的场景选择最合适的方法。
  一般情况下,这种功能的实现会使用一个变量来保存函数是否被调用过。比如 var func = function() {
  if(func.hasBeenCalled) return;
  func.hasBeenCalled = true;
  // TODO
};
  当然,这个变量也可以使用闭包,只是我懒得写。然后是另一种比较黑的方法,在函数调用后把自己的引用重置掉。 var func = function() {
  func = function() {};
  // TODO
};
  这个方法的适用性很小,仅当函数只有一个引用时才有效。如果这个引用被赋值到别的地方还可能出错。但它的代码是最简单的,不需要额外的变量来存储状态。
  但这个纠结的用法是因为被用在了一个函数上所以才让人觉得纠结。如果是一个对象的方法这么玩就没啥问题。因为 this.methodName 通常只有自己这个引用。 <script>
var A = function() {};
A.prototype.func = function() {
  this.func = function() {};
  document.write('hehe');
};

var a = new A();
a.func(); // 输出 hehe
a.func(); // 不输出
</script>
  这么一看就毫无违和感了吧?只是动态修改对象的方法这件事其实还是挺黑的,感觉有点依赖 JavaScript 的特性了。不过我自己还是可以接受的,可能会有一些 class 强迫症的人接受不了这种玩法吧?
网名:
54.144.24.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^