来自闭包的具有NEW值的变量存储在哪里?

时间:2019-04-11 01:08:14

标签: javascript

第1部分
JS函数中有一条规则,即每次执行完所有变量后,我们都会销毁本地执行上下文。

因此我无法在以下示例中理解:

将闭包的 NEW值的计数器变量存储在哪里以供c2和下一个再次使用 NEW值的c3使用?

第2部分

c1 = (counter = 0, counter = counter + 1) is 1;
c2 = (counter = 1, counter = counter + 1) is 2;
c3 = (counter = 2, counter = counter + 1) is 3;

示例增量1、2、3

    function createCounter() {
    let counter = 0;
    const myFunction = function () {
        counter = counter + 1;
        return counter;
    };
    return myFunction;
    }
    const increment = createCounter();
    const c1 = increment();
    const c2 = increment();
    const c3 = increment();
    console.log('example increment', c1, c2, c3);

我希望在第1部分的问题中解释第2部分中的步骤。

2 个答案:

答案 0 :(得分:1)


编辑

对您的特定示例的工作原理进行更深入的说明:

首先,您需要了解Javascript范围是如何工作的。然后,可以在该函数及其中定义的任何子函数中使用在函数范围内创建的任何对象,变量或函数。

                Count
Letter Direction           
A       -1          3
         1          0
D       -1          8
         1          1
F       -1          1
         1          1

该变量不适用于该函数范围之外的函数。 (通过另一个功能)。

如果将变量定义为静态类型(例如字符串,数字,数组或对象),则将其返回。因此,在此示例中:

function someFunction() { 
  var g = "Hello!"; // g is available to everything within someFunction
  g = "goodbye"; // change the value of g
  return g; // returns "goodbye"
}

-

大多数人都可以理解这个概念。它相当容易。您要问的真正问题是: 返回函数而不是值时会发生什么?

让我们看另一个例子:

myfunction() { 
   let a = 1;
   return a;
}

var b = myfunction(); // b = 1  

由于我们知道其他函数内部的函数都可以访问顶级函数中定义的所有事物(变量,函数等)(根据此答案的第一部分)。 因此,根据定义,函数function myFunction() { var a = 1; function myNestedFunction() { a++; return a; } return myNestedFunction; } 可以访问在其父函数中定义的变量myNestedFunction()

父函数然后返回a,它被视为元素的一种,然后可以使用函数的myNestedFunction参数进行访问。由于()可以从myNestedFunction访问a,因此不必每次都返回myFunction,而是可以将1设置为指向另一个变量并重新求值无需重新设置myNestedFunction变量。

a

不客气,感谢您的耐心配合。

答案 1 :(得分:1)

  

第1部分   JS函数中有一条规则,即每次执行完所有变量后,我们都会销毁本地执行上下文。

不,没有这样的规则。真正的规则是,再次调用该函数将建立不同的执行上下文,这是完全不同的野兽。当执行上下文不再可访问时,它实际上会被丢弃。由于您具有使用该执行上下文的函数的引用,因此除非您不再具有该引用,否则它不会被破坏。

与其他使用单个全局堆栈传递变量的语言不同,javascript使用其堆栈空间来保存执行上下文,而参数在较大的执行上下文中是它们自己的东西。

它可以帮助您将每个函数调用视为新对象还是现有对象,具体取决于调用位置和方式。对于闭包,它是对现有对象的调用。