理解JavaScript闭包

理解JavaScript闭包

闭包在 JavaScript 中可以理解为一个函数“记住”并可以访问它被创建时的环境中的变量,即使这个函数在其他地方被调用。

更通俗的例子

假设你有一个外公,他有一个秘密花园。外公希望你长大后能记住这个秘密花园的位置,但当他去世后,其他人不知道这个秘密花园在哪里。你可以理解为,你就是一个闭包,记住了外公的秘密花园的位置。

function 外公的秘密花园() {
    var 秘密花园位置 = "花园在后院";

    function 记住秘密花园() {
        console.log(秘密花园位置);
    }

    return 记住秘密花园;
}

var= 外公的秘密花园(); // 你得到了“记住秘密花园”这个函数

(); // 输出: 花园在后院

在这个例子中:

  1. 外公的秘密花园 是一个函数,它定义了一个变量 秘密花园位置,这个变量表示秘密花园的位置。
  2. 记住秘密花园 是一个内部函数,它可以访问外部函数 外公的秘密花园 中定义的变量 秘密花园位置
  3. 外公的秘密花园 函数执行完毕后,秘密花园位置 通常会被销毁。但是,由于 记住秘密花园 函数被返回,并且可以在其他地方调用,它“记住”了 秘密花园位置 的值。
  4. 当你调用 你() 这个函数时,它实际上是在调用 记住秘密花园 函数,并输出了 秘密花园位置 的值。

再举一个例子

假设你有一个笔记本,上面记着你妈妈的电话号码。无论你走到哪里,这个笔记本都会记着这个电话号码,你可以随时查看。

function 记妈妈电话号码(电话号码) {
    return function() {
        console.log("妈妈的电话号码是: " + 电话号码);
    };
}

var 你的笔记本 = 记妈妈电话号码("123-456-7890"); // 你把电话号码记在笔记本上了

你的笔记本(); // 输出: 妈妈的电话号码是: 123-456-7890

在这个例子中:

  1. 记妈妈电话号码 是一个函数,它接受一个参数 电话号码,并将其保存在内部。
  2. 返回的匿名函数可以访问 记妈妈电话号码 函数中的 电话号码 变量。
  3. 即使 记妈妈电话号码 函数执行完毕,匿名函数仍然可以记住并访问 电话号码 的值。
  4. 当你调用 你的笔记本() 时,它会输出妈妈的电话号码。

总结

闭包就像是一个函数带着它创建时的环境“一起走”。无论这个函数被移动到哪里,它都能记住并访问它创建时的那个环境中的变量。这样,即使外部环境已经变化或不再存在,函数仍然可以使用这些变量。

你可能感兴趣的:(javascript,开发语言,ecmascript)