Как этот фрагмент кода осуществляет закрытие? - PullRequest
0 голосов
/ 18 сентября 2018

Я читал главу о закрытии области из серии getify. Вы не знаете серию книг JS.Мне кажется, что я понимаю, как замыкание работает на уровне поверхности в данный момент, но все еще не могу понять, как этот фрагмент кода выполняет замыкание.

function setupBot(name,selector) {
    $( selector ).click( function activator(){
        console.log( "Activating: " + name );
    } );
}

setupBot( "Closure Bot 1", "#bot_1" );
setupBot( "Closure Bot 2", "#bot_2" );

Как я вижу это при вызове функцииИмя переменной и селектор в области действия setupbot назначаются аргументы, и активатор функции вызывается после щелчка, после которого функция возвращается.

Какая функция имеет замыкание в какой области в этом случае?

Ответы [ 2 ]

0 голосов
/ 18 сентября 2018

Переменная name сохраняется в замыкании, созданном

function activator(){
    console.log( "Activating: " + name );
}

Поэтому, когда вы нажимаете на соответствующий селектор, он записывает это имя.

Переменная selectorне упоминается в функции, поэтому его не нужно сохранять в замыкании.Он просто используется во время начального выполнения setupBot().

Закрытие создается всякий раз, когда функция содержит использование переменной, объявленной вне функции, и функция возвращается или сохраняется где-то (в данном случае этосохранено в прослушивателе события нажатия).

function setupBot(name, selector) {
  $(selector).click(function activator() {
    console.log("Activating: " + name);
  });
}

setupBot("Closure Bot 1", "#bot_1");
setupBot("Closure Bot 2", "#bot_2");
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<button id="bot_1">Bot 1</button>
<button id="bot_2">Bot 2</button>
0 голосов
/ 18 сентября 2018

Функция activator - это новая функция, которая вызывается при нажатии на элемент селектора.Так что в идеале он не имел бы доступа к переменной name, поскольку он не определен в своей области видимости.Но поскольку он находится в замыкании из-за своей внешней функции-оболочки, он может получить доступ к переменной name, и, следовательно, этот пример является примером замыкания.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...