Да, это закрытие.
Каждый раз, когда функция выполняется , создается новый объект для хранения (в качестве его свойств) переменных, объявленных с помощью var
, и каждой функции, объявленной внутри нее. Этот объект называется контекстом выполнения (или иногда объектом области действия).
Каждый раз, когда функция объявляется (или определяется в выражении), новая функция присоединяет к ней объект контекста выполнения, который является текущим. Это создает так называемую цепочку областей действия.
Когда для выполнения кода требуется преобразовать идентификатор в значение, он сначала ищет его в свойствах текущего контекста выполнения. Если идентификатор не найден, он использует объект контекста освобождения, присоединенный к выполняемой функции. Он продолжает подниматься по цепочке, пока не достигнет глобального уровня.
В вашем примере каждый раз, когда выполняется «самовозглашающаяся функция», создается новый объект контекста выполнения, содержащий свойства el
и num
. Поскольку функция, назначенная onclick, создается внутри этого контекста выполнения, вы будете каждый раз получать новый экземпляр этой функции. Каждый из этих экземпляров будет иметь соответствующий объект контекста выполнения. Следовательно, первый будет иметь контекст выполнения, когда num
был назначен 1, второй будет иметь контекст выполнения, где num
был назначен 2 и т. Д.
Когда каждая из функций onclick запускается, код сначала ищет идентификатор num
в текущем контексте выполнения. Однако эта внутренняя функция не изменяется, поэтому она не найдена. Таким образом, Javascript смотрит на контекст выполнения, присоединенный к функции, когда она была создана. Здесь он найдет num
, num
будет содержать значение, присвоенное ему во время этой итерации, как описано выше.