В функции JavaScript создайте область видимости.Например:
function scoped(){
let local = 10;
console.log(local) // this works local is within scope
}
scoped() // logs:
console.log(local) // error -- local doesn't exist out here.
За пределами scoped
local
не существует.
Функция внутри функции имеет доступ ко всей области видимости.Так что это работает:
function scoped() {
let local = 10;
function f() {
console.log(local) // this works local is within scope
}
f()
}
scoped()
Но что произойдет, если вы вернете функцию, которая ссылается на область действия функции?Оказывается, что внутренняя функция несет в себе всю сферу.Это закрытие:
function scoped(){
let local = 10;
function f(){
console.log(local) // this works local is within scope
}
return f
}
f = scoped()
f() // can still see local
// but nobody else out here can:
console.log(local) // still an error
Это позволяет вам делать очень приятные вещи - одна из них заключается в том, что вы можете сохранять некоторые переменные закрытыми, но при этом манипулировать ими с помощью замыкания.
Например, вот счетчик, который не требует переменной в глобальной области видимости:
function counter(){
let count = 0
return () => count++
}
let c = counter()
console.log(c()) // it can count but there's not count variable in scape
console.log(c())
console.log(c())
Делать это с глобальной переменной count сложно и рискованно, поскольку некоторые другие части кода конфликтуют с глобальной переменной.Выше ничего кроме функции c
не может получить доступ к счетчику.На самом деле вы можете сделать несколько независимых:
function counter(){
let count = 0
return () => count++
}
let c = counter()
let d = counter()
console.log("c:", c()) // it can count but there's not count variable in scape
console.log("c:", c())
console.log("d:", d()) // d has it's own closure
console.log("d:", d())
console.log("c:", c())
Вы можете многое сделать с замыканиями, и они важны в Javascript.Стоит потратить время, чтобы по-настоящему понять их.