为什么i变量是“副本”而不是对原始i的引用

时间:2014-01-08 15:10:13

标签: javascript

我对以下JavaScript代码感到困惑:

    // Because this function returns another function that has access to the
    // "private" var i, the returned function is, effectively, "privileged."

    function makeCounter() {
      // `i` is only accessible inside `makeCounter`.
      var i = 0;

      return function() {
        console.log( i++ );
      };
    }

    // Note that `counter` and `counter2` each have their own scoped `i`.

    var counter = makeCounter();
    counter(); // logs: 1
    counter(); // logs: 2

    var counter2 = makeCounter();
    counter2(); // logs: 1
    counter2(); // logs: 2

    i; // ReferenceError: i is not defined (it only exists inside makeCounter)

我不明白为什么计数器 counter2 中的i变量不是指同一个 i 值?

我的理解是counter和counter2应引用相同的函数,因为两者都被赋予了相同的函数,而函数是“引用数据类型”,不应该创建单独的副本。

此外,计数器 counter2 如何访问makecounter函数中设置的“private”值?

2 个答案:

答案 0 :(得分:2)

i位于makeCounter的本地。

每次调用该函数时,您都会获得一个新的i

该函数内定义的匿名函数可以访问i,因为它是在makeCounter内定义的。

该函数已返回,因此可在makeCounter之外使用,但仍可访问i ,因为它已定义。

  

我的理解是计数器和计数器2应该引用相同的函数,因为它们都被分配了相同的函数

他们没有被分配相同的功能。每次调用makeCounter时都会创建一个新函数。

答案 1 :(得分:0)

您需要了解的一件事是Javascript使用静态作用域。因此变量i仅在makeCounter函数的范围内可用。

当你调用makeCounter()时,它将i初始化为0并返回一个新的函数对象。并且对于每个函数对象都有自己的i实例。