1. 程式人生 > >一個只執行一次的once函式

一個只執行一次的once函式

 一個只執行一次的函式(最優解在下面)

function once(func) {
      var ran,
          result;

      if (!isFunction(func)) {
        throw new TypeError(funcErrorText);
      }
      return function() {
        if (ran) {
          return result;
        }
        ran = true;
        result = func.apply(this, arguments);

        // clear the `func` variable so the function may be garbage collected
        func = null;
        return result;
      };
 }
 function test(){
    alert('coinxu')
 }
 var newTest = once(test)
 newTest()
 newTest()

 

function test(){
    alert('coinxu')
}
var once = (function(){
    var memo = {}, i = 0;
    return function(fn){
        for(var key in memo){
            //匿名函式支援
            if(memo[key].func === fn||memo[key].func.toString() ===fn.toString()){
                return memo[key].result
            }
        }
        i += 1
        var result = fn()
        memo[i] = {func:fn, result:result}
        return result
    }
})()
once(test)
once(test)

 解法甚對  最優如下:
 

function test () {console.log('test')}

var once = function (fn) {
  var isFirst = true;
  return function () {
    if (isFirst) {
      isFirst = !isFirst;
      fn();
    }
  };
};

var b = once(test);
b(); // 'test'
b(); // nothing