试图理解闭包(JavaScript)

时间:2016-01-16 18:51:14

标签: javascript callback closures

function myFunc(inputFunc){
  var called = false;
  return function() {
    if (!called) {
      called = true;
      var storedResult = inputFunc();
      return storedResult;
    }
    else
      return storedResult;
    };
}

在上面的代码中,我不明白它在函数中返回if-else语句的目的是什么。如果我只是改为以下内容,那会不会产生同样的效果?

function myFunc(inputFunc){
  var called = false;
  if (!called) {
    called = true;
    var storedResult = inputFunc();
    return storedResult;
  }
  else
    return storedResult;
  }

1 个答案:

答案 0 :(得分:4)

  

不会是一样的......

实际上,外部函数返回一个函数,将被调用的变量包含在它的作用域中,以便以后的调用不会改变。 以下是第一个代码段的工作原理

var instance = inputFunc();

var storedResult = instance(); // returns the result

var runItAgain = instance(); // probably returns `undefined`

你的第二个版本不会做任何一个,它只是

var storedResult = inputFunc(); // result

var runItAgain = inputFunc(); // result again, the "called" variable is always false

换句话说,第一个版本返回结果一次,只返回一次,这里是一个片段



function myFunc(inputFunc) {
    var called = false;
    return function() {
        if (!called) {
            called = true;
            var storedResult = inputFunc();
            return storedResult;
        } else
            return storedResult;
    };
}

var instance = myFunc(function() {
	return 'result';
});

var log = [];

log.push( instance() ); // result
log.push( instance() ); // undefined
log.push( instance() ); // undefined
log.push( instance() ); // undefined

document.body.innerHTML = '<pre>' + JSON.stringify(log, null, 4) + '</pre>';
&#13;
&#13;
&#13;