我对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
时,如果它包含其自由变量(chiffre
和multiplicateur
)的绑定,它都会查询此闭包,并且由于这样做,结果确实为200。重要说明,您不会创建闭包,而JS引擎不会创建闭包(尽管您可以仅通过检查函数的词法范围来推断闭包的内容),但是在JS引擎执行代码和决定需要关闭。