我对JS中的闭包有疑问。以下是给定的功能:

function multiplicationParDeux() {
     var chiffre = 10;
     var fonction = function() { console.log(chiffre * multiplicateur); }
     chiffre = chiffre * 2;
     var multiplicateur = 10;
     return fonction;
    }

    var maFonction = multiplicationParDeux();
    maFonction(); //Output: 200


为什么输出是200?我在关闭后声明了我的乘数变量,console.log(chiffre * multiplicateur);部分如何识别乘数变量?

最佳答案

当内部函数-fonction从其封闭函数-multiplicationParDeux返回或在其自身的词法范围之外执行时,会从其词法范围(引用环境)中拖动变量及其值的记录。

返回fonction时,您可以将其闭包想象为具有以下属性的对象,该对象充当fonction内部自由变量的绑定。

chiffre: 20,
multiplicateur: 10


每次执行fonction时,如果它包含其自由变量(chiffremultiplicateur)的绑定,它都会查询此闭包,并且由于这样做,结果确实为200。

重要说明,您不会创建闭包,而JS引擎不会创建闭包(尽管您可以仅通过检查函数的词法范围来推断闭包的内容),但是在JS引擎执行代码和决定需要关闭。

09-28 07:57