内部函数和外部函数是否获得了相同变量的副本?

时间:2012-03-18 17:20:01

标签: javascript closures

对此代码感到有点困惑

var counter = function() {
    //...
    var count = 0;
    return function () {
        return count = count + 1;
    } 
}

var nextValue = counter();  
console.log(nextValue());
nextValue.count = 7;
console.log(nextValue());
console.log(nextValue.count);
console.log(nextValue());

输出

1
2
7
3

这是违反直觉的。计数有两种表示形式。一个在外部函数nextValue上,一个只有内部匿名函数可以看到。

纠正,还是我遗失了什么?

2 个答案:

答案 0 :(得分:4)

表达式nextValue.count 表示函数内声明的局部变量“count”。实际上,不可能从函数外部的代码创建对函数本地变量的引用。你在那里引用的只是函数对象的一个​​属性。

所以,是的,返回函数可以访问的“count”变量实际上对该函数是完全私有的,并且它被保存在由“counter”函数调用形成的闭包中。

如果您 想要这样做,您可以这样做:

function counter() {
  function actual() {
    return actual.count = actual.count + 1;
  }
  actual.count = 0;
  return actual;
}

编辑 - (修复了伪造的代码)里面的名称“actual”给返回的函数安全访问函数对象本身;最初我在那里输入了“this”,除非外部代码明确地设置它,否则这将不起作用。

答案 1 :(得分:1)

您描述它的方式,count实际上是一个私有变量。当您分配到nextValue.count时,您正在创建一个单独的媒体资源 - 不会访问由您的计数器增加的内部count