一个函数,并且这个函数可以访问到外部函数的变量,这样就形成了一个闭包。
闭包有以下几个作用:
封装变量:通过闭包,我们可以将一些变量封装在函数内部,避免污染全局作用域。这种方式也被称为模块模式。
保护变量:由于闭包内部的变量只能通过闭包内部的函数访问,因此可以保护这些变量,避免被外部误操作。
延长变量声明周期:如果一个变量在函数执行完毕后就被销毁了,但是如果这个变量被闭包引用了,那么这个变量就会一直存在,直到闭包被销毁。
实现回调和异步操作:通过闭包,我们可以将一个函数作为参数传递给另一个函数,用于回调或异步操作。
需要注意的是,闭包也有一些潜在的问题,如内存泄漏等。因此,在使用闭包时需要谨慎,合理使用。
有关闭包的代码
计数器
function counter() {
let count = 0;
return function() {
count++;
console.log(count);
}
}
const c = counter();
c(); // 1
c(); // 2
c(); // 3
私有变量
function Person(name) {
let _age = 0;
function setAge(age) {
_age = age;
}
function getAge() {
return _age;
}
return {
name: name,
setAge: setAge,
getAge: getAge
}
}
const person = Person("John");
person.setAge(30);
console.log(person.getAge()); // 30
模块提升
const module = (function() {
let privateVar = "I'm private";
let publicVar = "I'm public";
function privateFunc() {
console.log("I'm private func");
}
function publicFunc() {
console.log("I'm public func");
}
return {
publicVar: publicVar,
publicFunc: publicFunc
}
})();
console.log(module.publicVar); // "I'm public"
module.publicFunc(); // "I'm public func"