Ответ 1
Потому что функция, вызываемая сразу, называется, и это имя нельзя переназначить, чтобы ссылаться на что-то еще непосредственно внутри IIFE.
Любые выражения именованных функций также будут демонстрировать это поведение. Функция выражение, функция называется будет означать, что непосредственно внутри функции всегда будет относиться к самой функции, даже если вы пытаетесь передать его. a
a
Вы можете сделать ошибку явной, если вы используете строгий режим:
'use strict';
var a = 1;
(function a() {
a = 200;
console.log(a)
})()