带有两个实例化的Javascript闭包
我试图理解闭包,并使用下面的代码。我希望I的值在所有对象中都是相同的,因为闭包保留了对外部函数变量的引用带有两个实例化的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
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:不是真的,但那只是一个全局变量。如果它没有链接到外部范围(请参阅上面的“非闭包”示例)那么它只是一个局部变量。