Это статическая область видимости. Операторы внутри функции ограничены областью действия этой функции.
Однако Javascript ведет себя странно: без ключевого слова var вы подразумеваете глобальную переменную. Это то, что вы видите в своем тесте. Ваша переменная d доступна, потому что она является подразумеваемой глобальной, несмотря на то, что она написана в теле функции.
Кроме того, чтобы ответить на вторую часть вашего вопроса: функция существует в любой области, в которой она объявлена, точно так же, как переменная.
Примечание: вам, вероятно, не нужны глобальные переменные, особенно те, которые не подразумеваются. Рекомендуется всегда использовать ключевое слово var, чтобы избежать путаницы и сохранить все в чистоте.
Примечание. Стандарт ECMA, вероятно, не самое полезное место для поиска ответов о Javascript, хотя, безусловно, это не плохой ресурс. Помните, что javascript в вашем браузере — это всего лишь реализация этого стандарта, поэтому документ стандартов будет давать вам правила, которым (в основном) следовали разработчики при создании движка javascript. Он не может предоставить конкретную информацию об интересующих вас реализациях, а именно об основных браузерах. В частности, есть пара книг, которые дадут вам очень прямую информацию о том, как ведут себя реализации javascript в основных браузерах. Чтобы проиллюстрировать разницу, ниже я приведу выдержки из спецификации ECMAScript и книги по Javascript. Я думаю, вы согласитесь, что книга дает более прямой ответ.
Вот из Спецификации языка ECMAScript:
10.2 Вход в контекст выполнения
Каждый вызов функции и конструктора входит в новый контекст выполнения, даже если функция рекурсивно вызывает сама себя. Каждый возврат выходит из контекста выполнения. Выброшенное исключение, если оно не перехвачено, также может выйти из одного или нескольких контекстов выполнения.
Когда элемент управления входит в контекст выполнения, создается и инициализируется цепочка областей видимости, выполняется создание экземпляра переменной и определяется значение this.
Инициализация цепочки областей видимости, создание экземпляра переменной и определение значения this зависят от типа вводимого кода.
Вот цитата из сильный>:
8.8.1 Лексическая область видимости
Функции в JavaScript имеют лексическую, а не динамическую область видимости. Это означает, что они выполняются в той области, в которой они определены, а не в той, в которой они выполняются. Когда функция определена, текущая цепочка областей видимости сохраняется и становится частью внутреннего состояния функции. ...
Настоятельно рекомендуется для освещения подобных вопросов книга Дугласа Крокфорда:
http://oreilly.com/catalog/covers/9780596517748_cat.gif
Javascript, лучшие стороны, также от O'Reilly.
person
Community
schedule
24.10.2008