Это порядок!
Порядок приоритета. В коде документа во время разбора функции получают оценку до начала выполнения кода. Но объявленные переменные имеют больший приоритет в любом заданном контексте. И функции могут запускаться только после того, как все переменные были созданы.
Вот почему функция с объявленной переменной «name» возвращает значение своего локального имени. Поскольку он уже существует, и функция не должна «искать» ее значение во внешней области.
EDIT
Для более глубокого понимания более интересным примером того же случая является здесь:
var name = "Paul";
function users () {
name = "Dietrich";
if (!name) {
var name = "Jack";
}
console.log(name);
}
users(); // outputs "Dietrich"
console.log(name); // again outputs "Paul"
Итак, что же произошло?
Разве декларация name = "Dietrich"
не должна быть нацелена на глобальное значение переменной «name»?
Почему эта функция не сохраняется при возврате «Джека», как это было до? Или -Почему выход неожиданно не «Джек» и, конечно, не «Пол», а странный и совершенно неожиданный «Дитрих»?!
- По той же причине он продолжал перенастраивать «Джек» вместо из того, что следует за функциональной семантикой и ее условным предложением, и что это «Павел».
По причинам, описанным выше. При первом взгляде и объявлении функции мы name = "Dietrich"
четко нацелились на глобальный «Paul» Than, у нас есть дополнительная предосторожность, условное условие, которое должно помешать исполнению «Джека», поскольку уже существует переменное «имя» из внешней сферы. Но безрезультатно ...
Принимая во внимание еще более запутанную ситуацию - глобальный «Пол» по-прежнему неповрежден!
Мы назначаем «Дитрих» переменной «имя» из внешний охват только от нашей точки чтения. Поскольку var (s) оцениваются перед функциями и задолго до того, как начнут выполняться объявления тела функции.
И поскольку if(condition){ doesn't create a scope of its own }
не имеет значения, насколько глубоко в этом теле функции мы объявляем «имя», переменная. Каждое уравнение было разрешено к настоящему времени.
name = "Dietrich"
больше не будет изменять глобальное «имя» внешней области, поскольку переменная «name» уже присутствует в этой (локальной) области видимости функции, поэтому обычно «Дитрих» переписывает местного «Джека» не автостопом «Пола» Вселенной. И это потому, что var name
уже определен где-то вдоль текущей области.
Итак, это та же самая причина, по которой он раньше возвращал «неожиданный» «Джек». И это все.
Хорошо вот ответ, который я закончил тем, что нашел: вместо того, чтобы находиться на Пути, каталог с windows.h (в моем случае, C:\Program Files\Microsoft SDKs\Windows\v6.0A\Include) должен был быть установлен во Включать переменной среды.
Между прочим, создайте переменную среды %LIB %, имея в виду то же - путь ко всем каталогам lib SDKs