为什么我可以在任何 asycn 操作中访问外部作用域的变量

看看这段代码。

function func() {
    let x = 0;
    setTimeout(() => {
        console.log(x);
    },3000);
}

func();

我的问题是为什么我们可以在 setTimeout 函数中访问变量“x”。我知道这听起来很愚蠢,但让我解释一下。正如我所知,每当调用函数时,都会创建一个新的执行上下文并将其放入调用堆栈中。这个上下文是我们存储变量的地方。当我们尝试访问在其他地方声明的函数内的变量时,js 引擎会沿着调用堆栈向下查找并尝试在“父级”执行上下文之一中找到该变量。但是,众所周知 js 是单线程语言,这意味着它仅在 callstack 为空时才执行所有异步操作。所以这就是我的困惑的来源。如果

,我们如何在 setTimeout 回调中访问变量“x”
  1. 在回调的执行上下文中没有这样的变量。
  2. Callstack 是空的,js 引擎无法遍历它来找到这样的变量

还有一个问题。当我像这样更改代码时,为什么会打印 2.

function func() {
    let x = 0;
    setTimeout(() => {
        console.log(x);
    },3000);

    x = 2;
}

func();

wwz1989 回答:为什么我可以在任何 asycn 操作中访问外部作用域的变量

您刚刚发现 JavaScript's closures 允许函数访问周围的词法上下文并在函数本身处于活动状态时保持活动状态(在您的情况下尚未达到/清除超时)。>

本文链接:https://www.f2er.com/868.html

大家都在问