如何编写一个JavaScript函数,该函数每调用三次就会打印一次“ Hello World”?

时间:2018-11-17 21:50:05

标签: javascript node.js

我们可以使用代理来实现吗?

5 个答案:

答案 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();