0

我知道 JavaScript 的执行上下文是在调用函数时创建的。但我不明白下面的例子。示例 1 和示例 2 非常相似。

然而,这些结果并不相同。

我已经引用了链接。You-Don't-Konw JS博客参考以及与 stackoverflow 相关的问题

示例 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 都是 Bye。如果 JavaScript 的执行上下文是在函数调用的时候创建的,为什么两个结果不同呢?

4

2 回答 2

0

闭包取决于函数的创建位置而不是调用位置。示例 2 中的函数foo无法访问valuefunction的局部变量bar。因此,由于闭包,返回的值foovalue全局范围的。

于 2019-05-06T14:14:44.483 回答
0

这里的两个values是不同的;他们只是命名相同。您可以将它们视为value在全局范围内,valuebar. 就像在两个不同的目录中拥有相同名称的文件一样,它们实际上并不相同。

于 2019-05-06T14:16:43.513 回答