如何调用函数只在第一次返回一个字符串,之后返回undefined

时间:2014-07-31 04:32:48

标签: javascript

基本上,第一次运行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

3 个答案:

答案 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

小提琴:http://jsfiddle.net/bkX2d/