Путаница в обработке кода JavaScript

1

Код

function hi() {
    myvar = 'local variable';
}
console.log(myvar);

Выход: ReferenceError: myvar не определен

По моему мнению, javascript идет по строкам, анализирует переменные и их объем. Помня об этом, не следует, чтобы следующая печать была "неопределенной", поскольку myvar существует в глобальном масштабе?

  • 1
    Возможный дубликат определения глобальной переменной в функции JavaScript
  • 1
    @musefan это не печатает undefined самом деле. Вопрос в том, почему не ведется журнал не undefined (вместо этого у него есть сообщение об ошибке)
Показать ещё 4 комментария
Теги:

4 ответа

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

Нет, этого не должно быть, поскольку для печати undefined вам нужно сначала определить его в глобальной области.

Тот факт, что вы назначаете какое-то значение этой переменной внутри функции, ничего не значит до тех пор, пока сама функция не будет выполнена.

var myvar;

function hi() {
    myvar = 'local variable';
}
console.log(myvar);

Если вы опустите этот var myvar; line и выполнить функцию hi до того, как вы выполните console.log, в результате вы получите "local variable" потому что эта функция создает неявное глобальное связывание.

Чтобы проверить это, просто используйте strict mode и вы получите ошибку вместо результата выше, потому что строгий режим предотвращает неявные глобальные переменные.

"use strict";

function hi() {
    myvar = 'local variable';
}

hi();

console.log(myvar);
  • 0
    Я думаю, что это уже в глобальном масштабе. Если вы вызываете функцию hi, перед console.log (), она печатает 'local variable'.
  • 0
    @PrabhatDoongarwal проверить сейчас.
Показать ещё 8 комментариев
2

Как указано в документах MDN

Вы можете объявить переменную тремя способами:

  • С ключевым словом var. Например, var x = 42. Этот синтаксис может использоваться для объявления как локальных, так и глобальных переменных.

  • Просто присваивая ему значение. Например, x = 42. Если эта форма используется вне функции, она объявляет глобальную переменную. Он генерирует строгое предупреждение JavaScript. Вы не должны использовать этот вариант.

  • С ключевым словом let. Например, пусть y = 13. Этот синтаксис может быть использован для объявления локальной переменной-блока. См. Раздел "Переменная" ниже.

Ваша функция будет работать, потому что она удовлетворяет методу # 2, объявляя переменную, присваивая ей значение.

console.log(myvar) не будет работать, поскольку myvar никогда не был объявлен ни одним из трех способов, упомянутых выше. Таким образом, вы получаете ReferenceError.

По моему мнению, javascript идет по строкам, анализирует переменные и их объем. Помня об этом, не следует, чтобы следующая печать была "неопределенной", поскольку myvar существует в глобальном масштабе?

Нет, функция не вызывалась, и поэтому код внутри нее не выполнялся, поэтому переменная никогда не создавалась. Если у вас есть myvar = 'local variable'; вне функции, он будет работать.

  • 0
    Итак, js проверяет вызов функции перед обработкой кода в функции?
  • 0
    Да, конечно, он не будет запускать функции для вас, если вы не попросите об этом. Просто чтобы прояснить, я не имею в виду, что если вы вызываете функцию, скрипт будет анализировать скрипт по-разному. Разница лишь в том, что при вызове функции переменная определяется, так как присвоение значения переменной также объявляет ее (в javascript)
Показать ещё 5 комментариев
2

Проблема: myvar выбрасывает ReferenceError

function hi() {
  myvar = 'local variable';
}
console.log(myvar);

Я понимаю, вы думали, что получите undefined.

В приведенном выше коде myvar не был определен вне области функции. Поэтому при вызове console.log(myvar) он выдаст ошибку. Вы можете игнорировать объявление функции для этой части, как если бы вы имели:

console.log(myvar)

Решение: установите myvar вне области действия

Поэтому вам необходимо определить свою переменную перед ее регистрацией, например:

var myvar;

function hi() {
  myvar = 'local variable';
}
console.log(myvar);

Это обеспечит определение myvar здесь

  • вне области действия: он не имеет никакого значения, поэтому он undefined

  • в области функций: она установлена в строку


Больше о глобальных переменных

Поскольку вы не добавили оператор var перед myvar = 'local variable'; вы по существу получили доступ к глобальной переменной myvar. Поэтому, вызывая hi() вы измените значение myvar вне области действия:

var myvar;

function hi() {
  myvar = 'local variable';
}

console.log(myvar);
hi();
console.log(myvar);
  • 0
    myvar находится в глобальной области видимости, просто вызовите функцию перед console.log (), она печатает «локальную переменную».
  • 0
    Да, вы упомянули мой третий пункт о глобальных переменных ?
Показать ещё 4 комментария
0

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

var myvar;
function hi() {
  myvar = 'local variable';
}
console.log(myvar);
  • 0
    Я не думаю, что это локально для функции. Потому что после вызова функции вы можете получить к ней доступ в глобальной области видимости. По какой-то причине кажется, что он не устанавливает глобальную область видимости, пока после вызова функции
  • 0
    @musefan, действительно, если вы не используете var переменная myvar не будет локальной для hi
Показать ещё 1 комментарий

Ещё вопросы

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