Почему затененная переменная оценивает к неопределенному при определении во внешнем объеме?

iotop и latencytop может быть полезным. Ни один не дает точно "время ожидания ЦП, вызванное процессом" - я не уверен, что он даже имеет смысл, потому что ЦП может и действительно уходить для обслуживания других процессов при ожидании IO - но эти два инструмента дают обзоры (соответственно) системного трафика ввода-вывода и планирующих задержек.

8
задан BeachRunnerFred 8 March 2013 в 21:35
поделиться

6 ответов

В первом случае ваш код обращается к глобальной переменной "outside_scope", которая была инициализирована как "вне области видимости".

Javascript имеет область действия уровня функции, поэтому во втором случае он обращается к переменной области действия функции "outside_scope", но не еще был инициализирован во время окна предупреждения. Так что отображается undefined.

12
ответ дан 5 December 2019 в 04:43
поделиться

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

Например:

var outside_scope = "outside scope";
function f1() {
    alert(outside_scope) ;
    var outside_scope = "inside scope";
}
f1();

Получает интерпретацию в:

var outside_scope = "outside scope";
function f1() {
    var outside_scope; // is undefined
    alert(outside_scope) ;
    outside_scope = "inside scope";
}
f1();

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

20
ответ дан 5 December 2019 в 04:43
поделиться

JavaScript имеет область видимости функции, а не область блока.

Во втором случае объявление external_scope поднимается до вершины функции (но не присваивание).

Это отличный пример того, почему код JavaScript легче читать, если вы поместите все объявления переменных вверху функции. Ваш второй пример эквивалентен:

function f1() {
    var outside_scope;
    alert(outside_scope);
    outside_scope = "inside scope";
}

, и вы, вероятно, теперь можете понять, почему вы получаете «undefined».

5
ответ дан 5 December 2019 в 04:43
поделиться

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

Однако фактическое присвоение происходит только после предупреждения, отсюда и значение «undefined».

4
ответ дан 5 December 2019 в 04:43
поделиться

Это интересный случай.

в первом примере вы определили «глобальную» переменную. он имеет глобальную область видимости и поэтому доступен для выполнения в любой функции / объекте.

во втором примере вы «заблокировали» глобальную переменную с помощью переменной области действия, но поскольку она еще не была инициализирована в во время предупреждения возвращается «undefined».

Я согласен, что это не самая интуитивная причуда, но она имеет смысл.

1
ответ дан 5 December 2019 в 04:43
поделиться

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

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

var f1 = function ()  {
   // some code
   var counter = 0;
   // some more code
}

var f2 = function () {
   var counter; // initialized with undefined
   // some code
   counter = 0;
   // some more code
}

Во время выполнения f1() переводится в f2(). Я написал подробную статью об этом в блоге здесь. Надеюсь, это поможет вам понять, что происходит в вашем коде.

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

1
ответ дан 5 December 2019 в 04:43
поделиться
Другие вопросы по тегам:

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