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