Каков объем функции в Javascript/ECMAScript?

Я не могу в это поверить, но ....

В моем BookCatalogController.java у меня есть цитаты вокруг моего параметра @GetMapping

@GetMapping ("donPutQuoteAroundThisParam")

, так что теперь у меня есть

@GetMapping(Mappings.CATALOG_SIMPLE)
12
задан Shog9 17 August 2010 в 23:40
поделиться

5 ответов

Это - статический обзор. Операторы в функции ограничены по объему в той функции.

JavaScript имеет изворотливое поведение, однако, который является, что без ключевого слова var, Вы подразумевали глобальную переменную. Это - то, что Вы видите в своем тесте. Ваша "d" переменная доступна, потому что это - подразумеваемое глобальное, несмотря на то, чтобы быть записанным в теле функции.

Кроме того, для ответа на вторую часть вопроса: функция существует в любом объеме, которым она объявляется, точно так же, как переменная.

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

Заметка на полях: Стандарт ECMA не является, вероятно, самым полезным местом для нахождения ответов о JavaScript, хотя это, конечно, не плохой ресурс. Помните, что JavaScript в Вашем браузере является просто реализацией того стандарта, таким образом, документ стандартов будет давать Вам правила, которые (главным образом) сопровождались конструкторами, когда механизм JavaScript создавался. Это не может предложить определенную информацию о реализациях, о которых Вы заботитесь о, а именно, главные браузеры. Существует несколько книг в особенности, которые дадут Вам очень прямую информацию о том, как реализации JavaScript в главных браузерах ведут себя. Для иллюстрирования различия я буду включать выборки ниже и от спецификации ECMAScript и от книги по JavaScript. Я думаю, что Вы согласитесь, что книга дает более прямой ответ.

Вот из спецификации языка ECMAScript:

10.2 Ввод контекста выполнения

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

Когда управление вводит контекст выполнения, цепочка объема создается и инициализируется, переменное инстанцирование выполняется, и это значение определяется.

Инициализация цепочки объема, переменное инстанцирование и определение этого значения зависят от типа введенного кода.

Вот из JavaScript O'Reilly: полное руководство (5-й выпуск):

8.8.1 Лексический обзор

Функции в JavaScript лексически а не динамично ограничены по объему. Это означает, что они работают в объеме, в котором они определяются, не объем, от которого они выполняются. Когда функция определяется, цепочка текущей области сохраняется и становится частью внутреннего состояния функции...

Настоятельно рекомендованный для покрытия этих видов вопросов книга Douglas Crockford:

JavaScript, хорошие части http://oreilly.com/catalog/covers/9780596517748_cat.gif

JavaScript, Хорошие Части, также от O'Reilly.

22
ответ дан 2 December 2019 в 05:16
поделиться

Насколько я понимаю они эквивалентны, что касается обзора:

function a() { ... }

и

var a = function() { ... }
4
ответ дан 2 December 2019 в 05:16
поделиться

Кажется важным отметить, что, в то время как d создается как "глобальное", он в действительности создается как свойство объекта окна. Это означает, что Вы могли непреднамеренно перезаписывать что-то, что уже существует на объекте окна, или Ваша переменная на самом деле могла бы не быть создана вообще. Так:

function a() {
    d = 'Hello World';
}
alert(window.d); // shows 'Hello World'

Но Вы не можете сделать:

function a() {
    document = 'something';
}

потому что Вы не можете перезаписать объект window.document.

Для всех практических целей Вы можете, отображая, который весь Ваш код выполняет в гиганте with(window) блок.

2
ответ дан 2 December 2019 в 05:16
поделиться

JavaScript имеет два объема. Глобальный, и функциональный. Если Вы объявите переменную в функции с помощью ключевого слова "var", то это будет локально для той функции и любых внутренних функций. Если Вы объявляете переменную за пределами функции, она имеет глобальную область видимости.

Наконец, если Вы опускаете ключевое слово var, сначала объявляя переменную, JavaScript предполагает желание глобальной переменной, неважно, где Вы объявляете это.

Так, Вы вызываете функцию a, и функция объявляет глобальную переменную d.

1
ответ дан 2 December 2019 в 05:16
поделиться

...

function a() {
   function b() {
      alert('boo')
   }
   var c = 'Bound to local call object.'
   d = 'Bound to global object.'
}

не предшествуясь var, d глобален. Сделайте это к сделанному, d частный:

function a() {
   function b() {
      alert('boo')
   }
   var c = 'Bound to local call object.'
   var d = 'Bound to local object.'
}
0
ответ дан 2 December 2019 в 05:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: