Почему переменные, инициализированные в функциях, доступны глобально? - PullRequest
0 голосов
/ 05 июня 2019

Когда кто-то инициализирует переменную внутри области действия функции, предположительно, ничто не может получить доступ к этой переменной, кроме самой функции.

Почему иногда инициализация переменной в функции может быть доступна глобально?

Ниже приведен код:


function sayHello() {
  a = 'hello';
  console.log(a);
 }
}

фактически становится таким после подъема:

function sayHello() {
  var a; // undefined
  a = 'hello';
  console.log(a);
 }
}

sayHello() // outputs 'hello'
console.log(a) // Reference error: a is not defined.

Это все хорошо, пока это не произойдет:


function sayGoodbye() {
  var b = 'Goodbye';
}

фактически становится таким после подъема

function sayGoodbye() {
  var b;
  b = 'Goodbye'
}

sayGoodbye() // undefined
console.log(b) // outputs 'Goodbye'

Почему после вызова sayGoodbye переменная b становитсядоступны глобально или за пределами области действия функции, тогда как для sayHello существует ошибка ссылки?

Имеет ли console.log какое-либо отношение к изменению области действия?

Ответы [ 2 ]

1 голос
/ 05 июня 2019

Если вы присваиваете переменную без объявления, она становится глобальной переменной, если вы не используете строгий режим.

function sayGoodbye() {
  b = 'Goodbye';
}

она становится

var b;
function sayGoodbye() {
    b = 'Goodbye';
}
0 голосов
/ 05 июня 2019

Ваш взгляд на подъем неверен.Когда вы не объявляете переменную с var, она становится глобальной переменной, когда встречается .Там нет подъема переменной.Поэтому, если вы никогда не вызовете test, переменная не будет определена в глобальной области видимости.

function test() {
  try {
    console.log("inside try", foo);
  } catch (e) {
    console.log("nope inside try: ", e.message);
  }
  console.log("test before", typeof foo)
  foo = "bar";
  console.log("test after", typeof foo)
}

console.log('outside before called: ', typeof foo);
console.log('does not exist example: ', typeof bar);
try {
  console.log("outside try", foo);
} catch (e) {
  console.log("nope outside try: ", e.message);
}
test();
console.log('outside after called: ', typeof foo);

Теперь, если вы использовали var для объявления переменной, она будет поднята, если вы попытаетесь использовать ее до ее объявления.

function test() {
  // var foo; <-- it is hoisted to here
  try {
    console.log("inside try", foo);
  } catch (e) {
    console.log("nope inside try: ", e.message);
  }
  console.log("test before", typeof foo)
  var foo = "bar";  // line here acts like foo="bar" since declared at top with hoisting.
  console.log("test after", typeof foo)
}

console.log('outside before called: ', typeof foo);
console.log('does not exist example: ', typeof bar);
try {
  console.log("outside try", foo);
} catch (e) {
  console.log("nope outside try: ", e.message);
}
test();
console.log('outside after called: ', typeof foo);
...