带有两个实例化的Javascript闭包

带有两个实例化的Javascript闭包,javascript,closures,Javascript,Closures,我试图理解闭包,并使用下面的代码。我希望I的值在所有对象中都是相同的,因为闭包保留了对外部函数变量的引用 function Test(){ var i=10; return{ get:function(){return i;}, inc:function(){i++;} } } var test1= Test(); var test2=Test(); test1.get(); //outputs 10 test1.inc(); test2.get(); //output

我试图理解闭包,并使用下面的代码。我希望I的值在所有对象中都是相同的,因为闭包保留了对外部函数变量的引用

 function Test(){
 var i=10;
 return{
   get:function(){return i;},
   inc:function(){i++;}
   }
 }
var test1= Test();
var test2=Test();
test1.get(); //outputs 10
test1.inc();
test2.get(); //outputs 10, I am expecting it to be 11

我对闭包的理解正确吗?在这种情况下,我是否创建了闭包?我对闭包不熟悉,详细的解释会很好。谢谢

您已经创建了两个不同的实例。分配了两个不同的内存,这意味着两个不同的闭包。不要认为在结束时,内存已经在实例之间共享,从而造成混淆

test1.get(); //10
test1.inc();
test1.get(); //11
test2.get(); //10

如果您想创建一个共享变量,那么请阅读有关原型的内容。由于prototype是到函数引用的活动连接。

正如其他人所提到的,您基本上创建了两个闭包

理解闭包最简单的方法是它是全局变量概念的推广。事实上,javascript中的全局变量只不过是全局范围中的闭包

闭包是函数体引用外部范围内变量的机制。如上所述,全局变量只不过是一个闭包:

var x;

function x_plus_plus () {
    x++; // this variable is captured by a closure
}
每个作用域都允许您创建一个闭包。因此,除了全局作用域之外,您还可以在其他函数中创建闭包。就我个人而言,最能说明闭包是什么的最小示例代码是一个IIFE,它定义了共享一个变量的两个函数:

var incr;
var val;

(function(){
    var x = 0; // shared with the functions below var via closure

    incr = function(){x++};
    val = function(){return x};
})();

incr();
incr();
console.log(val()); // outputs 2 because the functions share x

console.log(x); // syntax error - x does not exist in this scope
请注意,闭包是在变量和该变量作用域中声明的函数之间发生的事情。它不是变量和声明变量的函数之间发生的事情:

function () {  <─────┐
                     ├── this is not a closure
    var foo; <───────┘
}

function () {
    var foo;   <────────────────┐
                                ├── this is a closure
    function bar () {           │
        do_something(foo);  <───┘
    }
}

var x;   <───────────────┐
                         ├── this is also a closure but we
function y () {          │   normally call it "global variable" 
    do_something(x); <───┘
}

function(){您已经创建了两个闭包。我认为您正在寻找的是函数测试的单例实现。这可能会在每次调用
Test()
时有所帮助,您会得到一个新闭包。为什么说“没有内部函数”?有一个内部函数,实际上有两个,
get
incr
,这两个函数都结束了
i
。更改了问题的标题。原型的工作方式与您显然认为的不同。它们不是共享读/写变量的方式。第一次设置(分配给)时属性,它将创建该属性的实例特定版本。谢谢!一个附带的问题,是否必须在另一个函数中至少有一个函数才能有闭包?@NirbhayJha:不是真的,但那只是一个全局变量。如果它没有链接到外部范围(请参阅上面的“非闭包”示例)那么它只是一个局部变量。