Я собираюсь предположить, что вы не слишком заботитесь о получении этого конкретного результата, но вы заботитесь о понимании концепции.Поэтому я упростил ваш пример до этого:
function greet (greeting) {
return function person (name) {
console.log(greeting + ',' + name)
}
}
helloGreeting = greet('hello')
helloGreeting('andrew') // 'hello, andrew'
helloGreeting('joseph') // 'hello, joseph'
Здесь происходит то, что при первом вызове greet
функция возвращает закрытие - person
.Закрытие - это функция, объявленная внутри другой функции, и благодаря тому, что она объявлена внутри этой функции, она имеет доступ ко всему, что определено во внешней функции.
Поэтому после вызова greet('hello')
js возвращает person
функция, и эта функция имеет доступ к переменной greeting
, определенной ранее.
В частности, контекст выполнения функции person содержит переменную приветствия.Вы можете думать о контексте выполнения как о блоке, и каждый раз, когда вы запускаете person
, вызывая helloGreeting
, этот блок также содержит переменную greeting
, определенную как hello.
прелесть этого в том, что теперьВы также можете определить другие приветствия.
niceToMeetYouGreeting = greet('niceToMeetYou')
yoGreeting = greet('Yo')
Это делает действительно многократно используемый код, который может быть создан путем составления нескольких функций.Действительно хороший способ сделать ваш код модульным!