Это называется закрытием.
В JavaScript код внутри функций имеет доступ к переменным, определенным внутри этой функции, и к переменным, определенным во всех родительских функциях.
Если вы ссылаетесь на переменную в дочерней функции, которая определена в родительской функции, а затем возвращаете дочернюю функцию, JavaScript сохранит переменные из родительских функций и они будут доступны в возвращаемых функциях.
В вашем примере вы возвращаете дочернюю функцию
b => {
console.log(a+b);
}
из getFunc
функции, поэтому дочерняя функция все еще имеет доступ к переменной a
, определенной в родительской функции. При выполнении f(5)
дочерняя функция выполняет выражение 7 + 5
, и вы получаете 12
в консоли.