Ловушки Яваскрипта, часть 1

Глобальное пространство имен

Когда вы объявляете функцию вне класса (или неймспейса) в PHP вы, то вы добавляете функцию в глобальное пространство имен. В Javascript нет такого понятия, как пространство имен, все относится к одному глобальному объекту. Если код запущен в браузере, то этот объект window. Другое важное отличие Яваскрипта от PHP: функции и переменные – это атрибуты глобального объекта.

Это может быть источником проблем, потому что вы не получите предупреждения, о том что какая-нибудь глобальная функция была по ошибке переопределена.

Глобальное пространство имен

Один из методов, который позволяет поместить все переменные и функции в автономный контейнер, заключается в использовании самозапускаемой анонимной функции. А все используемые объекты обычно передаются в эту анонимную функцию как параметры. Это один из вариантов реализации модулей в Яваскрипте.

использование самозапускаемой анонимной функции в Java

Внутри таких анонимных функций мы закрыты от глобальных переменных, и здесь экспортируем функции нового модуля помещая их в переменную-параметр. На самом деле можно просто добавить функции переменной module, но мы передаем ее в функцию, чтобы было абсолютно ясно какие функции экспортирует модуль. И таким образом мы не зависим от имени переменной, в данном случае module. Особенно важно, что мы объявляем зависимости явно и заранее, а не полагаемся на глобальные переменные.

Вы наверно заметили var. Зачем используется var: var создает переменную в текущей области видимости. Если опустить var, тогда значение переменной будет присвоено переменной, которой находится в пространстве имен на уровень выше.

Зачем используется var

Как вы можете видеть, довольно опасно полагаться на глобальные в ваших функциях, в связи с возможными побочными эффектами и коллизиями, которые неизбежно происходят. Теперь, что происходит, когда мы используем var?

что происходит, когда мы используем var

Итог: все переменные находятся в области видимости функции (которая сама по себе объект), и если вы объявите переменные с var, то эти переменные находятся в области видимости функции. Если переменная объявлена без var, то она принадлежит глобальной области видимости.

И еще взглянем на «подъем переменных»(variable hoisting).

подъем переменных»(variable hoisting

Итак, как вы можете видеть, это на самом деле не имеет значения, где вы объявляете переменную с var, потому что переменные создаются до выполнения кода функции. Но в реальных программах объявление переменной чаще всего находится до её использования. Можно объявлять переменные как до использования, так и после, но нужно понимать как все это работает.

Функции, объявленные с помощью function в JavaScript (не присваивания, а functon functonName(){}) также «поднимаются» в начало кода и становится доступной в любом месте.

Функции, объявленные с помощью function в JavaScript

Подъем функций не происходит, когда вы используете var при объявлении функции:

Подъем функций не происходит, когда вы используете var

Внутри таких анонимных функций мы закрыты от глобальных переменных, и здесь экспортируем функции нового модуля помещая их в переменную-параметр. На самом деле можно просто добавить функции переменной module, но мы передаем ее в функцию, чтобы было абсолютно ясно какие функции экспортирует модуль. И таким образом мы не зависим от имени переменной, в данном случае

Оцените статью
Добавить комментарий