JS中闭包的理解
const secureBooking = function () { // 调用这个函数 这个值外部无法访问 let passengerCount = 0; return function () { passengerCount++; console.log(`${passengerCount} passengers`); }; }; // 所以一个函数总是可以访问变量环境 创建它的执行上下文 ,即使执行环境消失之后 // 闭包是封闭变量,闭包使函数可以访问所有变量其父函数,即使父函数已经返回之后,所以函数保持对其外部范围的引用,即使那个外部范围消失之后,这基本上保留了整个范围链 const booker = secureBooking(); booker(); booker(); // 我们不必须手动创建闭包,这是JS完全自动完成,我们不需要做任何事 console.dir(booker); */ // 闭包示例1 let f; const g = function () { const a = 23; f = function () { console.log(a * 2); }; }; const h = function () { const b = 777; f = function () { console.log(b * 2); }; }; g(); f(); console.dir(f); // f函数进行了重新分配 // 所以闭包总是确保一个函数不会失去连接,到它诞生地存在的变量 h(); f(); console.dir(f);
// 闭包示例2 const boardPassengers = function (n, wait) { const perGroup = n / 3; setTimeout(function () { console.log(`We are now boarding all ${n} passengers`); console.log(`There are 3groups,each with ${perGroup}`); }, wait * 1000); console.log(`Will start boarding in ${wait} seconds`); }; // 由此证明 闭包具有优先权 const perGroup = 1000; boardPassengers(180, 3);