[英]Update static variable in javascript function
我已通读了以下示例7的代码,这些示例在JavaScript闭包如何工作的以下答案上发布:
function newClosure(someNum, someRef) {
// Local variables that end up within closure
var num = someNum;
var anArray = [1,2,3];
var ref = someRef;
return function(x) {
num += x;
anArray.push(num);
alert('num: ' + num +
'\nanArray ' + anArray.toString() +
'\nref.someVar ' + ref.someVar);
}
}
obj = {someVar: 4};
fn1 = newClosure(4, obj);
fn2 = newClosure(5, obj);
fn1(1); // num: 5; anArray: 1,2,3,5; ref.someVar: 4;
fn2(1); // num: 6; anArray: 1,2,3,6; ref.someVar: 4;
obj.someVar++;
fn1(2); // num: 7; anArray: 1,2,3,5,7; ref.someVar: 5;
fn2(2); // num: 8; anArray: 1,2,3,6,8; ref.someVar: 5;
我为示例使用了相同的逻辑
function increment() {
var id = 0;
return function(number) {
id += number;
alert('Unique ID: ' + id);
}
}
six = increment();
fourteen = increment();
six(6);
fourteen(8);
在这个例子中,我从
fn1(2); //num 7
num输出7是因为根据我的理解,自第一次调用以来,它已被设置为5。 因此,使用相同的推理,我希望十四(8)调用返回数字14,因为我相信ID将被更新为6而不是保持为0。为什么变量不是静态的? 我将如何说明它是静态的?
我还试图让该函数设置一个数字参数,并将ID设置为等于该参数,但这也没有更新它。
newClosure
的闭包将在每次调用时捕获初始化为someNum
的num
。 因此, f1
有其自己的num
,从4
开始,以1到5
递增,然后以2到7
递增。 同时, f2
有其自己的num
,从5
开始,依次增加1到6
,再增加2到8
。 f1
和f2
调用的交错可能会使您感到困惑,但是它们是完全分开的,并且不共享任何变量。
同样, increment
构造的闭包将捕获id
值为0
。 six
id
从0
开始,递增6到6
。 fourteen
独立地从其自己的0
开始,并增加8到8
。
相比:
var globalCounter = 0;
function incrementWithGlobalCounter() {
var counter = 0;
return function(number) {
counter += number;
globalCounter += number;
alert('Counter: ' + counter + '; Global Counter: ' + globalCounter);
}
}
var one = incrementWithGlobalCounter();
var two = incrementWithGlobalCounter();
one(1); // 1, 1
one(1); // 2, 2
two(1); // 1, 3
two(2); // 3, 5
one(5); // 7, 10
在这里, globalCounter
被外部闭包捕获,因此它被所有内部闭包共享。 counter
是由内部封闭物捕获的并且位于外部封闭物的本地,因此它对于每个内部封闭物都是独立的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.