一个只执行一次的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

猜你喜欢

转载自blog.csdn.net/zhan_lijian/article/details/84304412