Переменные Javascript не ведут себя так, как ожидалось в Scratchpad

1

Я следую инструкциям Javascript для разработчиков Mozilla, и есть сегмент на переменном хостинге. В учебном пособии в какой-то момент упоминается использование Firefox Scratchpad для редактирования javascript для быстрого сохранения и просмотра кода.

Код, который я использовал (скопировать вставку из учебника):

/**
 * Example 1
 */
console.log(x === undefined); // true
var x = 3;

/**
 * Example 2
 */
// will return a value of undefined
var myvar = 'my value';

(function() {
  console.log(myvar); // undefined
  var myvar = 'local value';
})();

Однако console.log(x === undefined) возвращает false. И если я запустил console.log(x); вместо этого он фактически возвращает 3. console.log(myvar); ниже возвращает неопределенные, как ожидалось.

Я смущен как то, что предполагается здесь, это документация, возможно, неправильная/устаревшая или Scratchpad интерпретирует этот код иначе, чем стандартный JavaScript, и если да, то почему? Я попытался запустить файл.js, и я получаю результаты, как ожидалось.

  • 1
    Консоль будет неявно использовать глобальную область текущей страницы ( window ), поэтому после определения x она остается определенной. Вы можете обернуть весь этот код в большую немедленно выполняемую функцию, чтобы убедиться, что вы начинаете с чистого контекста.
  • 0
    Возможно, вы запускали пример кода дважды? Тогда x был бы уже инициализирован с 3 на втором (и всех последующих) прогонах.
Показать ещё 1 комментарий
Теги:
scope
hoisting

1 ответ

0
Лучший ответ

В непосредственной функции, вы повторно объявил myvar переменную:

(function() {
  console.log(myvar); // undefined
  var myvar = 'local value';
})();

Таким образом, глобальная переменная myvar из области window будет поднята, поэтому она возвращает undefined в console.log(myvar); ,

С другой стороны, если вы замените его на console.log(x); , он будет печатать 3 потому что вы не обновили переменную x.

Твоя проблема:

И для первого console.log(x === undefined); выражение, он возвращает false, только если вы повторно выполнить его, так что, возможно, в вашем случае это было выполнено дважды.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню