如何使这个简单的 javascript 闭包工作
how to make this simple javascript closure work
我正在向这样的朋友解释 javascript 关闭:
function outer() {
var count = 0;
return (function(){
count++;
console.log(count);
})();
}
我试图向他展示在执行外部函数时这个 'count' 变量是如何存储的。
所以我尝试在 javascript 控制台中执行此操作,并想向他展示当您在控制台中执行此操作时
outer(); // prints out 1
outer(); // calling again prints 2
outer(); // prints out 3
但实际上这件事发生了
outer(); // printed 1
outer(); // printed 1 again
outer(); // again 1
我不明白这里出了什么问题。谁能指导一下。
因为你的count
是在函数内部声明的,所以对函数作用域来说是"private",所以你的函数每次被调用时,变量count
都会创建并初始化为 0
然后你的内部函数,也就是闭包递增它,这就是它打印 1
的原因,然后当你的闭包 returns 时,你的 count
变量是垃圾-collected 因为它的范围在那里结束——在匹配的大括号内,尝试将 count
移动到任何函数之外的最外层,然后你会得到你想要的,然后你的 count
将成为一个全局变量,它在生产代码中不好,因为你不想污染你的全局池,并产生内存泄漏问题。闭包基本上只是像 Java 中那样的内部函数。
您每次调用 outer()
时都设置了 count=0
。如果你希望 count
是私有的,意思是在全局范围之外,那么我会使用这样的模块模式:
var counter = (function(c){
var count = 0;
c.outer = function(){
count++;
console.log(count);
};
return c;
}({} || counter))
counter.outer();
或者您可以简单地使用 outer()
return 函数:
function outer() {
var count = 0;
return function(){
count++;
console.log(count);
};
}
var myo = outer();
myo();
myo();
myo();
感谢@elclanrs。这是工作代码。
function outer() {
var count = 0;
return (function(){
count++;
console.log(count);
});
}
现在当我调用这个函数并将它存储在一个变量中时
var myouter = outer();
myouter();
// 1
// undefined
myouter();
// 2
// undefined
myouter();
// 3
// undefined
我正在向这样的朋友解释 javascript 关闭:
function outer() {
var count = 0;
return (function(){
count++;
console.log(count);
})();
}
我试图向他展示在执行外部函数时这个 'count' 变量是如何存储的。
所以我尝试在 javascript 控制台中执行此操作,并想向他展示当您在控制台中执行此操作时
outer(); // prints out 1
outer(); // calling again prints 2
outer(); // prints out 3
但实际上这件事发生了
outer(); // printed 1
outer(); // printed 1 again
outer(); // again 1
我不明白这里出了什么问题。谁能指导一下。
因为你的count
是在函数内部声明的,所以对函数作用域来说是"private",所以你的函数每次被调用时,变量count
都会创建并初始化为 0
然后你的内部函数,也就是闭包递增它,这就是它打印 1
的原因,然后当你的闭包 returns 时,你的 count
变量是垃圾-collected 因为它的范围在那里结束——在匹配的大括号内,尝试将 count
移动到任何函数之外的最外层,然后你会得到你想要的,然后你的 count
将成为一个全局变量,它在生产代码中不好,因为你不想污染你的全局池,并产生内存泄漏问题。闭包基本上只是像 Java 中那样的内部函数。
您每次调用 outer()
时都设置了 count=0
。如果你希望 count
是私有的,意思是在全局范围之外,那么我会使用这样的模块模式:
var counter = (function(c){
var count = 0;
c.outer = function(){
count++;
console.log(count);
};
return c;
}({} || counter))
counter.outer();
或者您可以简单地使用 outer()
return 函数:
function outer() {
var count = 0;
return function(){
count++;
console.log(count);
};
}
var myo = outer();
myo();
myo();
myo();
感谢@elclanrs。这是工作代码。
function outer() {
var count = 0;
return (function(){
count++;
console.log(count);
});
}
现在当我调用这个函数并将它存储在一个变量中时
var myouter = outer();
myouter();
// 1
// undefined
myouter();
// 2
// undefined
myouter();
// 3
// undefined