javascript - 了解 JavaScript 中的闭包范围

标签 javascript closures theory

我一直在阅读“你不懂 JS”系列丛书,我有一个关于闭包的问题。

var a;

function wait() {
  a = 10;

  return setTimeout(function timer() {
    console.log('Hello closure ', a);
  }, 1000)
}

const fn = wait;
fn();
console.log(a);

如果我在控制台中询问a的值而不执行函数(fn()),它会说它是未定义,这是正确的。

现在,如果我在 1 秒后执行函数 fn() ,它将打印 Hello Closure 10 我知道计时器有一个等待函数的闭包,这就是它打印的原因该值,即使它是在定义它的词法范围之外执行的。

但是如果现在在控制台中打印 a 值(运行 fn() 后),它也会输出 10 ,所以我猜是这样不是词法范围,从全局范围来看,查找永远不会向下(我的意思是它在嵌套函数中深入查找),它总是向上查找变量(向上到函数的封闭范围) .

所以我想知道这是否也是闭包,或者变量在运行函数后得到了另一个值,仅此而已?

最佳答案

如果在函数内部实例化该变量,则会阻止同名的全局变量发生更改。我在函数中添加了 var a = 10 。我将全局作用域的 var 留在那里,这样你就可以看到它现在没有改变。这更多的是一个变量范围问题。

闭包按照您的预期工作,只是您设置了一个全局变量。

var a;
function wait() {
  var a = 10;

  return setTimeout(function timer() {
    console.log('Hello closure ', a);
  }, 1000)
}

const fn = wait;
fn();
console.log(a);

关于javascript - 了解 JavaScript 中的闭包范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55423108/

相关文章:

php - 在 php 7.4 中重写匿名函数

c++ - 你如何从紧密循环中分解出分支?

javascript - 将组件保存到列表中,然后有条件地渲染

javascript - Python 套接字脚本 <-> HTML 客户端

c# - Closure 的 R 实现不同于其他函数式语言,这使得它表现得像 C# 等命令式语言?

c# - 有人可以用真正简单的语言向我解释什么是闭包吗?

lambda - 什么是 lambda(函数)?

user-interface - 菲茨定律,将其应用于触摸屏

javascript - 如何在使用 this.$router.go(-1); 后重新加载 localStorage VueJS

javascript - 我怎样才能使可折叠的内容默认传播(显示)