基本上,第一次运行hello()时,它应该打印" Hello"控制台,然后打印未定义...怎么可能这样做?
function Hello(){
return "Hello";
}
function foo(fn){
//not sure how to approach this
}
var hello = foo(Hello);
hello(); // return Hello
hello(); // return undefined
hello(); // return undefined
答案 0 :(得分:0)
有多种方法可以做到这一点,但它们涉及在函数外部创建变量以跟踪函数是否已运行和/或运行了多少次。
对于后一种情况:
var counter = 0;
然后,正常运行您的功能,如果不是第一次,请返回undefined
:
function foo(){
if(counter < 1){
counter++;
return "Hello";
}else{
return undefined;
}
}
这是可扩展的,因此如果您希望多次返回if
,可以更改"Hello"
语句的条件。
如果这是您唯一的用例,最好使用布尔值:
var hasRun = false;
function foo(){
if(hasRun){
return undefined;
}else{
hasRun = true;
return "Hello";
}
}
答案 1 :(得分:0)
试试这个例子:
function Hello() {
return "Hello";
}
function foo(fn) {
var ctx = {};
ctx.flag = false;
ctx.run = function() {
var rtn = this.flag ? undefined : fn();
this.flag = true;
return rtn;
};
return function () {
return ctx.run();
};
}
var hello = foo(Hello);
alert(hello());
alert(hello());
alert(hello());
答案 2 :(得分:0)
此方法使用闭包来包装原始函数。
当您创建foo
的多个实例时,它也会起作用,因为它会单独保持其调用状态,并且不会污染全局范围。
function Hello(){
return "Hello";
}
function foo(fn) {
var firstCall = true; //define the marker for first call
return function() { //return the function that will be "hello()"
//check for first call and decide what to return
return firstCall
? (function() {
firstCall = false; //mark that first call has been done
return fn.call(); //return the result of Hello
})()
: undefined; //return undefined
};
}
var hello = foo(Hello);
//wrapped your calls in document.writeln to see the result
document.writeln(hello()); // return Hello
document.writeln(hello()); // return undefined
document.writeln(hello()); // return undefined