JavaScript闭包示例和解释

时间:2017-08-01 14:22:28

标签: javascript closures

我在codeproject上找到了这个闭包的例子,但它没有解释它是如何工作的。



    function getMultiplier(multiplyBy){
       function multiply(num){
          return multiplyBy * num;
       }
 
       return multiply;
    }
 
    var multiplyByTwo = getMultiplier(2);
    var multiplyByTen = getMultiplier(10);
    var twoIntoFive = multiplyByTwo(5); 
    var tenIntoSix = multiplyByTen(6);  

    console.log(twoIntoFive); // 10
    console.log(tenIntoSix); // 60




现在我将假设,我的C大脑正在发生什么。请纠正我或给出你的解释。

  1. javascript中的函数也可以是对象,因此内部函数multiply(num)是getMultiplier的一种方法,从外面看。
  2. var multiplyByTwo在使用参数2调用时被赋予函数getMultiplier的返回值。
  3. 当你调用getMultiplier(2)时,javascript解释器根据getMultiplier()的定义在内存中创建一个对象。
  4. 该对象有一个方法乘法,并且它的地址被赋值给变量multiplyByTwo。
  5. var twoIntoFive = multiplyByTwo(5);调用getMultiplier(2)对象的方法乘以(num)和参数5.
  6. 将简单的数字10返回到变量twoIntoFive
  7. multiplyByTwo = 0;将使javascript的垃圾收集器从内存中删除对象getMultiplier(2)。

3 个答案:

答案 0 :(得分:1)

实际上multiply只是一个函数而不是OOP方法。

基本上,函数是对象,但是可以调用。在这种情况下,如果一个函数是一个对象,那么这不是一个问题,如果你可以移交一个函数的引用,那就更多了。这可以通过return multiply完成。

使用参数值调用getMultiplier后,将存储该值并返回(并分配)函数。

然后你需要调用该函数,该引用存储在multiplyByTwo

局部变量multiplyBy用于返回结果。没有创建对象。

答案 1 :(得分:0)

有趣的问题。

  1. 几乎正确,除了在基本级别,在javascript中实际上all functions are objects。另外,查看后两个变量twoIntoFivetenIntoSixmultiply()getMultiplier()范围内的独立函数(意味着它还包含对其中变量的引用)功能)。

  2. 完全

  3. 正确,但请注意,它仍然与getMultiplier不同。

  4. this article中所述,javascript创建的接口不是对象,而是创建一个接口,该接口引用了函数内已经声明的变量。

  5. 这就是它的工作方式。但是twoIntoFive实际上调用了引用getMultiplier()函数参数

  6. 的返回接口
  7. 正确。

  8. 这是正确的。由于您删除了对界面的引用,因此它将被删除。

  9. 进一步阅读

    在对javascript有疑问时,提及MDN通常是一个好主意。这是我到目前为止阅读的最完整的文档。

    如果您在我的回答中发现错误或有其他问题,请随时纠正我或提供一些反馈

答案 2 :(得分:-1)

基本上功能是一种功能。我不会说multiply(num)是一个getMultiplier的方法,它只是在它的体内声明。

也许这样会更容易理解?

var x = function getMultiplier(multiplyBy){
   var y = function (num){
      return multiplyBy * num;
   }

   return y;
}

反正。它的工作方式是:调用getMultiplier返回一个“乘法”函数。乘法函数返回multiplyBy * num,但getMultiplier返回一个预先生成的乘法函数的排序,其乘法已被getMultiplier的参数替换。

因此,当你调用getMultiplier(2)时,你在multiplyByTwo变量下得到的是:

function multiply(num){
   return 2 * num;
}

由于getMultiplier(num)只是替换返回的乘法函数中的参数,因此您可以将其传递给任何内容,并且不会删除任何内容。