В чем разница внутренней функции и функции параметра в цепочке областей действия?
Я знаю, что контекст выполнения 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
глобального масштаба.