Сферы не спроектированы таким образом в JavaScript. Чтобы присоединить переменную x к ее области действия, вам нужно будет ссылаться на объект для этой области либо по имени, либо по этой ссылке.
В вашем примере происходит то, что ваш вызов printX пытается записать переменную x, присоединенную к функции external. функции наследуются от объектов в JavaScript, и в результате к ним могут быть привязаны свойства, поэтому вместо того, чтобы выдавать ошибку ссылки, вместо этого вы получите неопределенное значение, поскольку переменная не существует.
Для получения дополнительной информации о области видимости, пожалуйста, смотрите мой ответ по области действия в JavaScript .
var x = 10; // Globally scoped variable named "x"
function outer() {
var x = 20; // Locally scoped to outer function variable named "x"
// in outer function, this variable takes precedence over the
// globally scoped x which was 10
function inner() {
var x = 30; // Locally scoped to inner function variable named "x"
// in inner function, this variable takes precedence over the
// parent scoped x which was 20
function printX() {
console.log(outer.x); // Tries to read "x" property of the outer function
// If this had been console.log(x) it would give 30 because it is scoped to the function inner's variable environment
}
printX();
}
inner();
}
outer();
Что касается того, что делать дальше, это действительно зависит от конечной цели. Как было указано в комментариях, простой способ исправить это - просто переименовать переменные. Однако это все равно не решит основную проблему при попытке доступа к переменной по имени свойства, а не по имени переменной. Чтобы получить доступ к переменной по имени, просто используйте ее имя (и различайте имена, если они разделяют область видимости), а не пытайтесь получить доступ к имени свойства, которого в этом случае не существует.