Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 内部函数和外部函数是否有相同变量的副本?_Javascript_Closures - Fatal编程技术网

Javascript 内部函数和外部函数是否有相同变量的副本?

Javascript 内部函数和外部函数是否有相同变量的副本?,javascript,closures,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

只是被这段代码弄糊涂了

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
这是违反直觉的。count有两种表示形式。一个在outerfunction nextValue上,另一个只有内部匿名函数才能看到


正确,还是缺少什么?

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

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

如果您确实希望这样做,您可以这样做:

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

编辑-(固定假代码)内部的名称“actual”使返回的函数能够安全地访问函数对象本身;最初我在那里输入了“this”,除非外部代码显式地设置它,否则这将不起作用。

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

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

如果您确实希望这样做,您可以这样做:

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

编辑-(固定假代码)内部的名称“actual”使返回的函数能够安全地访问函数对象本身;最初我在那里输入了“this”,除非外部代码显式地设置它,否则这将不起作用。

按照您的描述方式,
count
实际上是一个私有变量。当您被分配到
nextValue.count
时,您正在创建一个单独的属性——不访问由计数器递增的内部
count

按照您的描述,
count
实际上是一个私有变量。当您被分配到
nextValue.count
时,您正在创建一个单独的属性——不访问由计数器递增的内部
count