为什么 i 变量是"copy"而不是对原始 i 的引用

  • 本文关键字:原始 引用 变量 copy 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)

我不明白为什么计数器和计数器 2 中的 i 变量不是指相同的 i 值?

我的理解是,计数器和计数器 2 应该引用相同的函数,因为两者都被分配了相同的函数,并且函数是"引用数据类型",不应该创建单独的副本。

另外,计数器和计数器 2 如何访问 makecounter 函数中设置的"私有"值?

imakeCounter的本地。

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

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

该函数被返回,因此它在makeCounter外部可用,但由于定义它的位置,它仍然可以访问i

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

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

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

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

最新更新