Давайте построчно,
Здесь b();
вы вызываете функцию b
. Что имеет функция b
в своем теле? Объявление новой функции, имя которой a
. Когда вы получаете доступ к a
внутри b
, вы фактически не получаете доступ к глобальной переменной a
, а только о той функции, которую вы только что объявили. Таким образом, 10 будет установлен на указатель, который указывает на функцию, называемую a, а не глобальную переменную, называемую
Но почему первый блок кодовых предупреждений 1? Я смущен
Потому что, когда двигатель JavaScript идет выполнить задание:
a = 10;
проверяет, где a
было определено. Поскольку в текущей области, где вы пытаетесь установить 10 на a
, есть объявление функции, имя которой равно a
. Тогда произойдет то, что я описал выше. Но вы бы сказали, почему? Объявление функции ниже назначения. Причина, по которой это происходит, - это то, что движок JavaScript сначала обрабатывает объявления в вашем скрипте, а затем переходит к выполнению вашего скрипта. Поэтому, когда двигатель будет задан вопрос о a
, где определяется a
, как всегда он будет выглядеть сначала в текущей области. Если его там нет, он будет выглядеть в области, где заключена текущая область. В вашем случае это глобальный масштаб, поскольку я могу сделать вывод из вашего кода. Поэтому, если вы определяете эту функцию, второй шаг, который я упомянул ранее, был бы выполнен, и поскольку существует переменная с именем a
, она изменила бы ее значение. Если не существует какой-либо переменной, то a
была бы определена на глобальном масштабе, и это значение было бы 10.
var a = 1;
function b() {
a = 10;
return;
// I renamed the function from a to c to notice the hoisting
function c() {}
}
b();
console.log(a);
'функция а() {}' просто как ' var a; '. 'A' в' b' не является 'a' наружу. Также 'a' никогда не вызывается. – Xufox
'function a() {}' создаст указатель для функции, а 'a = 10' присваивает/заменяет значение этому указателю, а не' a' определяется за пределами – Rajesh
. Ваш первый фрагмент кода * не * фактически анализируется как второй один. Переменная 'a' всегда остается за пределами функции' a() '. – haim770