1. Вызов вложенной функции без обращения к внешней функции может происходить в случае использования замыканий. В замыкании внутренняя функция имеет доступ к переменным внешней функции даже после завершения работы внешней функции. Таким образом, внутренняя функция может быть вызвана самостоятельно, без необходимости обращения к внешней функции.
2. Принцип работы замыкания в данном примере кода заключается в том, что функция `makeCounter` создает и возвращает внутреннюю функцию, которая имеет доступ к переменной `count` из внешней функции `makeCounter`. При каждом вызове переменной `counter`, значение переменной `count` увеличивается на 1 благодаря замыканию, которое сохраняет значение переменной между вызовами функции `counter`.
3. При вызове переменной `counter`, значение увеличивается на 1, а не начинается с 0 каждый раз, потому что переменная `count` является частью замыкания и сохраняет свое значение между вызовами функции `counter`.
4. При выводе содержимого функции в `alert` появляется текстовая строка, а не результат выполнения функции, потому что результат выполнения функции не передается в `alert`, а передается только текстовая строка, соответствующая содержимому функции. Для вывода результата выполнения функции в `alert`, нужно добавить вызов функции, например, `alert(counter())`.