В javaScript ничто не называется областью уровня блока. Он обрабатывается так же, как и глобальная переменная. Теперь давайте проанализируем эти утверждения и их объем. Сначала вы объявили var x = 5;. Затем вы определили две функции, а затем снова определили var x = 10;. Обратите внимание, что JavaScript переопределит значение x. Теперь x равно 10 глобально.
Теперь вы указали z = g (f); Вы передаете функцию в качестве параметра. Внутри g вы снова объявили x как var x = 7;. Обратите внимание, что переменная, определенная внутри функции, имеет более высокое предпочтение, чем одно и то же имя переменной, объявленное в глобальной области, а также текущее значение переменной видно только этой функции. Вне g все знают, что x равно 10. Но внутри g значение x будет равно 7.
Теперь вы вернули h (x); это означает, что вы вызываете f (y) как f (7); f все еще знает, что x равно 10 глобально и не имеет никакого представления о том, существует ли он даже внутри функции g. Таким образом, f вычисляет (10 + 7) - 2. Следовательно, значение z становится равным 15.
Для пояснения я бы рекомендовал использовать отладчик, присутствующий в инструментах браузера. Отлаживайте каждую строку и понимайте, как работает область действия. Надеюсь, поможет.
Я был очень взволнован, когда читал, что вы все глубже и глубже. Я действительно надеялся, что ты еще глубже. – IMTheNachoMan
@IMTheNachoMan, поскольку вопрос был о том, почему 'x' имел особое значение, я остановился на этом этапе. Если вопрос был «почему« z »имеет значение, которое он делает?» Я бы прошел через всю казнь. Это просто вопрос соблюдения программы. – zzzzBov
Я знаю. Я пошутил. Мне просто понравилось, как вы это делали шаг за шагом. :) – IMTheNachoMan