一个只执行一次的函数(最优解在下面)
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