一個只執行一次的once函式
阿新 • • 發佈:2018-12-28
一個只執行一次的函式(最優解在下面)
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