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);