JavaScript:函数及其作用域/词法环境如何传递?

标签 javascript function scope closures

我正在使用闭包,并且可以毫无问题地理解内部函数如何访问外部词法环境:

function outer() {
  var bar = 0;
  function inner() {
    console.log(bar);
  }
  inner();
}
outer();    // prints '0'

但令我着迷的是:

function foo() {
  return function inner() {
    console.log(bar);
  }
}
function outer() {
  var bar = 0;
  var fakeInner= foo();    // not the same as "var fakeInner= function () { console.log(bar); }"
  fakeInner();
}
outer();    // ReferenceError: bar is not defined

在这里,我尝试通过将“内部函数”分配给从外部函数返回的函数表达式来“定义”“fakeInner”。

我曾经认为 JavaScript 使用其代码的“副本”创建了 fakeInner ,类似于: var fakeInner= function () { console.log(bar); },然后就可以访问 bar,但事实并非如此——当调用 fakeInner 时,JavaScript 会追溯到它的 定义。我的理解正确吗?也就是说,函数对象(声明或表达式)仅仅是对其定义点的引用,传递它们不会改变它们的词法环境(因此内部函数必须使用显式语法在内部定义)?

最佳答案

是的,函数只能访问它们自己的词法环境——从它们定义的地方。 JavaScript 没有dynamic scope其中函数可以对其调用范围进行任何类型的访问。

这是通过将作用域附加到函数对象来实现的,它是闭包的一部分。

关于JavaScript:函数及其作用域/词法环境如何传递?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35244201/

相关文章:

c++ - 使用 boost::iterator_range;我的数据在哪里超出范围?

c++ - 我如何从 void 中退出我当前的范围,以便我可以回到 main?我需要做什么?

javascript - 元素上的 CSS 过渡更平滑

具有 Unresolved 重载调用成员函数的 C++ 成员函数

android - 如何将 ViewModelScope 等异步协程范围的值返回到您的 UI?

javascript - 如何在所有元素上仅触发一次toggle()?

c - 从 C 中的函数返回指针错误

javascript - 有没有办法在 angular-ui-router 中获取子状态列表?

javascript - 将 Chrome 中 keydown 上的 <div> 标记替换为 <br> 以实现 HTML contenteditable

javascript - 如何将skylink集成到react项目中?