好吧,我正在凝视着学习闭包是如何工作的……而我被困在这个容器上已经有几个小时了。我只是不明白它是如何工作的。

我必须找到变量结果的最终值。

    var hidden = mystery(3);
    var jumble = mystery3(hidden);
    var result = jumble(2);

    function mystery ( input ){
      var secret = 4;
      input+=2;
      function mystery2 ( multiplier ) {
         multiplier *= input;
         return secret * multiplier;
      }
      return mystery2;
    }


    function mystery3 ( param ){
      function mystery4 ( bonus ){
        return param(6) + bonus;
      }
      return mystery4;
    }


答案是122,但我不确定该数字如何。

我计算出的答案是362。这显然是错误的。

我有362这样的

var hidden = mystery(3);
var jumble = mystery3(hidden);
var result = jumble(2);

function mystery ( input ){  //used 3 as an input
  var secret = 4;
  input+=2;
  function mystery2 ( multiplier ) { //used 3 as multiplier
     multiplier *= input; // 3 * 5
     return secret * multiplier;
  }
  return mystery2;   //returned 60
}


function mystery3 ( param ){  //used 60 as param
  function mystery4 ( bonus ){ //used 2 as bonus
    return param(6) + bonus; //60(6) + 2
  }
  return mystery4; // answer is 362
}


有人可以告诉我您到底能得到多少答案122吗?

最佳答案

简单来说,闭包意味着超出范围的局部变量的值将保留在函数内部。

让我们逐步看一下您的代码:

var hidden = mystery(3);


现在,mystery返回一个函数。但是它实际上返回了什么。一个简单的alert(hidden)语句将告诉您它返回,

function mystery2( multiplier ) {
    multiplier *= input;
    return secret * multiplier;
}


现在,如果您查看此函数的局部变量的值,


multiplier是一个参数,它的值将是调用它时传递给它的值
但是input的值是什么?
secret


这就是关闭起作用的地方。输入值将取自创建此函数的作用域。创建此函数时,inputsecret的值是什么?让我们再次看一下mystery

function mystery ( input ){ // value 3 is passed here as a parameter
    var secret = 4;
    input+=2;
    ...
}


因此,我们发现input实际上具有值5,而secret具有值4。现在,返回的函数基本上等效于:

function mystery2( multiplier ) {
    multiplier *= 5;
    return 4 * multiplier;
    // for future use, let's say that above statement is equivalent to:
    // return 4 * (multiplier * 5);                               ----- (1)
    // (now be a good boy/girl and don't scroll down to end)
}


好,接下来:

var jumble = mystery3(hidden);


同样,mystery3返回一个函数。 alert(jumble)为此:

function mystery4( bonus ){
    return param(6) + bonus;
}


再一次,以与以前相同的方式思考,我们可以说这等同于:

function mystery4( bonus ){
    return mystery2(6) + bonus; // param <- hidden <- mistery2
} //                                                             ----- (2)


最后,

var result = jumble(2);


等效于:

var result = mystery4(2);


那是,

var result = mystery2(6) + 2; // because (2), see above


那是

var result = 4 * (6 * 5) + 2; // because (1), see above


ew ...

122

关于javascript - 有人可以解释一下此javascript闭包的工作原理吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24856862/

10-12 12:21
查看更多