我们可以使用代理来实现吗?
答案 0 :(得分:10)
您需要函数以某种方式具有 state (或使用外部变量)-例如,您可以拥有一个计数器,每次调用该函数时递增该计数器,并且该计数器是否为模3是0
,打印文本。
const fn = (() => {
let count = 0;
return () => {
count++;
if (count % 3 === 0) console.log('Hello World');
};
})();
fn();
fn();
console.log('about to call for third time');
fn();
另一种选择是将count
放在fn
之外,例如:
let count = 0;
function fn() {
count++;
if (count % 3 === 0) console.log('Hello World');
}
fn();
fn();
console.log('about to call for third time');
fn();
但这并不是那么独立,因此count
可以被同一范围内的其他事物修改,而您不需要IIFE。
答案 1 :(得分:0)
var counter = 0;
function helloWorld(){
counter++
if(counter % 3 == 0){
console.log("hello world");
}
}
答案 2 :(得分:0)
也许是这样的:
var counter=0;
function hello(){
counter++;
document.getElementById('div_for_counter').innerHTML='attempt - '+counter;
if(counter==3){
alert('Hello World');
counter=0;
document.getElementById('div_for_counter').innerHTML='counter => 0';
}
}
<div id="div_for_counter">counter => 0</div>
<input type="button" value="Hello" onclick="hello();" />
答案 3 :(得分:0)
如果您正在寻找一种没有显式状态的方法,生成器可以做一些有趣的事情:
var f = function* k(){ yield; yield; console.log("Hello World") }()
f.next();
f.next();
f.next(); // Prints "Hello World"
简而言之,生成器是可以产生多个值并在每个yield语句之间暂停的函数,直到再次调用其next
方法为止。您可以创建无限迭代器(例如针对fibonacci系列的迭代器)或创建流等。这只是滥用行为,以使其在函数体内暂停3次。
答案 4 :(得分:0)
如上所述,您需要跟踪某些状态。将其封装到函数中的另一种方法是使用this
。
function fn() {
this.called = this.called + 1 || 1;
if (this.called % 3 === 0) console.log('Hello World');
}
fn();
fn();
console.log('about to call for third time');
fn();