У меня есть следующий код:Javascript - не могу понять закрытие
function bird(type) {
return function (whattosay) { //return the whole function
console.log (type + ' ' + whattosay)
}
}
var birdRef = bird('blackbird');
birdRef('singing in the dead of night');
var secondRef = bird('whitebird');
birdRef('singing after that night');
Я пытаюсь ознакомиться с двумя понятиями, закрытие и цепочки областей видимости. Ну, на моем первом birdRef я получаю взамен новый объект функции, затем я вызываю его после этой строки. В конце я вижу, что в «дочери ночи» пение «черного дрозда» в консоли. Я понимаю, что для того, чтобы найти тип птицы var, закрытие дает вам ссылку на родителя, и он несколько ищет этот var в цепочке областей видимости и, наконец, находит его, поэтому мы видим тип птицы.
Ну тогда у вас есть это:
var secondRef = bird('whitebird');
новый аргумент был принят, так что теперь переменная «тип» изменяется в зависимости от птицы дрозд к Whitebird.
Теперь я вернусь к моим предыдущим создали функцию birdRef, то, что я не понимаю, что происходит дальше:
birdRef('singing after that night');
я получаю «дрозд пения после той ночи», вместо Whitebird. Ну, если я не ошибаюсь, разве функция birdRef не попадает в ее родительскую функцию, а читает тип обновленной переменной птицы (я имею в виду, что он не мог найти этот var в локальной среде, поэтому он посмотрел во внешней среде и нашел var "type")?
Извините, если я не имею никакого смысла, поскольку я новичок в этом, и спасибо за ваше время.
Нет, каждый вызов функции создает новый контекст (среду) с отдельной переменной типа. 'birdRef' и' secondRef' - два разных объекта функции, и они закрываются по двум различным переменным. – Bergi
так что, каждый вызов функции птицы создает новую функцию для птиц, подходящую для вызывающего? – RunningFromShia
Правильно, каждая 'bird()' возвращает новую функцию (с тем же кодом, но с другим контекстом) – Bergi