Влияет ли поднятие вложенной функции на глобальную переменную (объявленную в той же функции)? - PullRequest
1 голос
/ 02 октября 2019
var b = 4;
function f() {
  b = 7;
  return b;
}

a = f();
console.log(a); //output: 7
console.log(b); //output: 7

В приведенных выше кодах b = 7 делает b автоматически глобальным, изменяя таким образом значение var b на 7. Но когда вложенная функция b добавляется, как показано ниже, я не понимаю результат вывода:

var b = 4;
function f() {
  b = 7;
  return b;
  function b() {}
}

a = f();
console.log(a); //output: 7
console.log(b); //output: 4

По моему мнению, поскольку функция b поднимается в функции f, ссылка на функцию b сначала создается на объекте активации, и когда мы получаем интерпретатор, получаем b = 7, мы уже видимимя свойства b существует, поэтому код b = 7 ничего не делает и продолжает работу, поэтому console.log(b) выводит 4. Но почему console.log(a) все еще выводит 7? b = 7 здесь ничего не должно делать, верно?

1 Ответ

4 голосов
/ 02 октября 2019

Для первого блока кода это утверждение не является точным:

В кодах выше, b = 7 делает b автоматически глобальным, таким образом изменяя значение переменной b на 7.

В операторе b = 7 b связан с этим внешним var b объявлением, поэтому b = 7 присваивает этой b переменной в замыкании.

Во втором блоке кода вы неправильно понимаете, что делает подъем. Думайте о подъеме как о простом перемещении объявления в верхнюю часть его области действия, поэтому:

function f() {
  b = 7;
  return b;
  function b() {}
}

... ведет себя так, как если бы вы делали это:

function f() {
  let b = function () { }
  b = 7;
  return b;
}

На линии b = 7, вы присваиваете новое значение 7 локальной переменной b. Следовательно return b; возвращает 7.

...