В чем разница внутренней функции и функции параметра в цепочке областей действия?

Я знаю, что контекст выполнения JavaScript создается при вызове функции. Но я не понимаю пример ниже. Пример 1 и Пример 2 очень похожи.

Однако эти результаты не совпадают.

Я уже ссылался на ссылки. Справочник по JS и блогу You-Don't-Konw, связанный с вопросом stackru

Пример 1

var value = "Hello";

function bar() {
  var value = "Bye";

  function foo() {
    return value;
  }

  console.log(foo());
}

bar(); // Bye

Пример 2

var value = "Hello";

function foo() {
  return value;
}

function bar(func) {
  var value = "Bye";
  console.log(func());
}

bar(foo); // Hello

Я ожидал, что оба примера - пример 1 и пример 2 - пока. Если контекст выполнения JavaScript создается во время вызова функции, почему эти два результата отличаются?

2 ответа

Два valueздесь разные; они просто названы одинаково. Вы можете думать о них как value в глобальном масштабе, и value в объеме bar, Как и файлы с одинаковыми именами в двух разных каталогах, они на самом деле не одинаковы.

Закрытие зависит от того, где была создана функция, а не от того, где она была вызвана. Функция foo в примере 2 нет доступа к локальной переменной value функции bar, Таким образом, поэтому из-за закрытия значение, возвращаемое из foo является value глобального масштаба.

Другие вопросы по тегам