function fn(){
console.log("xxx");
}
function once(fn){
}
once(fn);// xxx
once(fn);// 没了
function fn(){
console.log("xxx");
}
function once(fn){
}
once(fn);// xxx
once(fn);// 没了
我也想了下,写了个比较二的函数:
var once = function(callback) {
if (!callback.prototype.isOnce && typeof callback === 'function') {
var args=[].slice.call(arguments,1);
var result=callback.apply(this,args);
callback.prototype.isOnce = true;
return result;
}
};
var add = function(x, y) {
return x + y;
};
once(add,2,3)
缺点在于给函数创建了一个属性。。。
但是,我又不想把函数给毁灭掉,所以就这么干了。
function once(fn) {
var called = false
return function(){
if(!called) {
called = true
return fn.apply(null, arguments)
}
return undefined
}
}
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
function once(fn){
if(!once.executed ){
once.executed = []
}
if (once.executed.indexOf(fn) >= 0 ){
return
}
fn()
once.executed.push(fn)
}
不支持IE
//被执行一次的函数
function add(a, b){
console.log(a + b);
}
//立即执行函数加闭包的形式实现,真实的once函数为return返回的函数
var once = (function(){
var meme = {};
return function(fn){
var args = [];
if(meme[fn.name] === undefined) {
meme[fn.name] = fn;
//分割参数
args = Array.prototype.slice.call(once.arguments, 1, once.arguments.length);
return fn.apply(null ,args); //默认使用window调用
} else {
return;
}
};
})()
8 回答5.6k 阅读✓ 已解决
9 回答8.9k 阅读
6 回答4.5k 阅读✓ 已解决
5 回答3.4k 阅读✓ 已解决
7 回答9.6k 阅读
4 回答7.8k 阅读✓ 已解决
5 回答7k 阅读✓ 已解决
刚开始以为楼主需要的是这个
一个只执行一次的函数
copy from lodash.once
不过还是给出你的答案