Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.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,我是这样向一位朋友解释javascript闭包的: function outer() { var count = 0; return (function(){ count++; console.log(count); })(); } var counter = (function(c){ var count = 0; c.outer = function(){ count++; conso

我是这样向一位朋友解释javascript闭包的:

function outer() {
    var count = 0;
    return (function(){
        count++;
        console.log(count);
    })();
}
var counter = (function(c){
    var count = 0;

    c.outer = function(){
        count++;
        console.log(count);
    };
    return c;
}({} || counter))

counter.outer();
我试图向他展示在执行外部函数时如何存储这个“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 
我不明白这里出了什么问题。有人能告诉我吗。

这是因为您的计数是在函数内声明的,因此它是函数作用域的私有项,因此每次调用函数时,都会创建变量计数并初始化为0,然后您的内部函数(也称为闭包)将其递增,这就是为什么它会打印1,然后当闭包返回时,您的count变量是垃圾收集的,因为它的作用域到此为止-在匹配的花括号内,尝试将count移动到任何函数外的最外层,然后您将得到您想要的,然后您的count将成为一个全局变量,在生产代码中不好,因为您不想污染全局池,并造成内存泄漏问题。闭包基本上就是Java中的内部函数

这是因为您的计数是在函数内部声明的,因此它是函数作用域的私有项,因此每次调用函数时,都会创建变量计数并将其初始化为0,然后您的内部函数aka closure将其递增,这就是为什么它会打印1,然后当您的闭包返回时,您的count变量是垃圾收集的,因为它的作用域到此为止-在匹配的花括号内,尝试将count移动到任何函数外的最外层,然后您将得到您想要的,然后您的count将成为一个全局变量,在生产代码中不好,因为您不想污染全局池,并造成内存泄漏问题。闭包基本上就是Java中的内部函数

每次调用outer时都将count设置为0。如果您希望count是私有的,即在全局范围之外,那么我将使用如下模块模式:

function outer() {
    var count = 0;
    return (function(){
        count++;
        console.log(count);
    })();
}
var counter = (function(c){
    var count = 0;

    c.outer = function(){
        count++;
        console.log(count);
    };
    return c;
}({} || counter))

counter.outer();
或者您可以简单地让外部返回一个函数:

function outer() {
    var count = 0;
    return function(){
        count++;
        console.log(count);
    };
}

var myo = outer();
myo();
myo();
myo();
每次调用outer时,都将count设置为0。如果您希望count是私有的,即在全局范围之外,那么我将使用如下模块模式:

function outer() {
    var count = 0;
    return (function(){
        count++;
        console.log(count);
    })();
}
var counter = (function(c){
    var count = 0;

    c.outer = function(){
        count++;
        console.log(count);
    };
    return c;
}({} || counter))

counter.outer();
或者您可以简单地让外部返回一个函数:

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

感谢@elclanrs。这是工作代码

function outer() {
  var count = 0;
  return (function(){
    count++;
    console.log(count);
  });
}
现在当我调用这个函数并将其存储在变量中

var myouter = outer();
myouter();
// 1
// undefined
myouter();
// 2
// undefined
myouter();
// 3
// undefined

您可能打算返回一个函数。var myouter=外部;子宫肌;子宫肌;myouter@elclanrs这是第一次奏效。然而,再次称之为myouter;抛出错误TypeError:undefined不是函数Outer不是返回函数,而是返回undefined。返回一个函数,但不要执行它,它应该可以工作。谢谢!成功了!:您可能打算返回一个函数。var myouter=外部;子宫肌;子宫肌;myouter@elclanrs这是第一次奏效。然而,再次称之为myouter;抛出错误TypeError:undefined不是函数Outer不是返回函数,而是返回undefined。返回一个函数,但不要执行它,它应该可以工作。谢谢!成功了!:我想做的是让count成为内部函数的私有函数,并且仍然以这种方式向他展示示例。你有办法做到这一点吗?我想向他展示闭包是如何用来保持变量的私密性的。因此,您的答案不适用于这种情况。您可以像以前一样通过将私有变量包含在函数中来创建它们,但为了实现您的目标-调用函数3次并期望计数为3,您不能这样做,因为您的计数的范围是函数,然而,你可以使用setTimeout来实现你想要的,我想做的是让count成为内部函数的私有函数,并且仍然以这种方式向他展示示例。你有办法做到这一点吗?我想向他展示闭包是如何用来保持变量的私密性的。因此,您的答案在这种情况下不适用。您可以像以前一样通过将私有变量封装在函数中来创建它们,但为了实现您想要的功能—调用函数3次并期望计数为3,您不能这样做,因为您的计数的作用域是函数,但是您可以使用setTimeout来实现您想要的功能。