js只執(zhí)行1次的函數(shù)示例

字號:


    在我們?nèi)粘i_發(fā)的時(shí)候,經(jīng)常會碰到一種這樣的情況:想讓某個(gè)函數(shù)只執(zhí)行一次,特別是在一些循環(huán)或定時(shí)執(zhí)行的時(shí)候。
    直接上代碼:
    function runOnce(fn, context) { //控制讓函數(shù)只觸發(fā)一次
      return function () {
        try {
          fn.apply(context || this, arguments);
        }
        catch (e) {
          console.error(e);//一般可以注釋掉這行
        }
        finally {
          fn = null;
        }
      }
    }
    // Usage 1:
    var a = 0;
    var canOnlyFireOnce = runOnce(function () {
      a++;
      console.log(a);
    });
    canOnlyFireOnce(); //1
    canOnlyFireOnce(); // nothing
    canOnlyFireOnce(); // nothing
    // Usage 2:
    var name = "張三";
    var canOnlyFireOnce = runOnce(function () {
      console.log("你好" + this.name);
    });
    canOnlyFireOnce(); //你好張三
    canOnlyFireOnce(); // nothing
    // Usage 3:
    var obj = {name: "天涯孤雁", age: 24};
    var canOnlyFireOnce = runOnce(function () {
      console.log("你好" + this.name);
    }, obj);
    canOnlyFireOnce(); //你好天涯孤雁
    canOnlyFireOnce(); // nothing
    因?yàn)榉祷睾瘮?shù)執(zhí)行一次后,fn = null將其設(shè)置未null,所以后面就不會執(zhí)行了。再貼一個(gè)網(wǎng)上別人分享的代碼,道理一樣的:
    function once(fn, context) { 
      var result;
      return function() { 
        if(fn) {
          result = fn.apply(context || this, arguments);
          fn = null;
        }
        return result;
      };
    }
    // Usage
    var canOnlyFireOnce = once(function() {
      console.log('Fired!');
    });
    canOnlyFireOnce(); // "Fired!"
    canOnlyFireOnce(); // nothing
    以上就是為大家整理讓javascript只執(zhí)行一次的函數(shù)示例,有需要的可以參考。