js实现once
实现 once 函数
在 JavaScript 中,once 函数用于确保某个函数只能被调用一次,后续调用不再执行。以下是几种实现方式:

闭包实现
通过闭包保存一个标志位,记录函数是否已被调用:

function once(fn) {
let called = false;
return function(...args) {
if (!called) {
called = true;
return fn.apply(this, args);
}
};
}
函数属性实现
利用函数对象的属性来存储调用状态:
function once(fn) {
return function(...args) {
if (!fn.called) {
fn.called = true;
return fn.apply(this, args);
}
};
}
ES6 Proxy 实现
使用 Proxy 拦截函数调用:
function once(fn) {
let called = false;
return new Proxy(fn, {
apply(target, thisArg, args) {
if (!called) {
called = true;
return Reflect.apply(target, thisArg, args);
}
}
});
}
使用示例
const logOnce = once(console.log);
logOnce("Hello"); // 输出 "Hello"
logOnce("World"); // 无输出
注意事项
- 如果函数需要绑定特定的
this上下文,确保使用apply或call正确传递。 - 如果需要支持异步函数,上述实现同样适用,因为 Promise 会保持返回值的引用。






