繁体   English   中英

在javascript函数中更新静态变量

[英]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设置为等于该参数,但这也没有更新它。

http://jsfiddle.net/de9syawe/4/显示。

newClosure的闭包将在每次调用时捕获初始化为someNumnum 因此, f1有其自己的num ,从4开始,以1到5递增,然后以2到7递增。 同时, f2有其自己的num ,从5开始,依次增加1到6 ,再增加2到8 f1f2调用的交错可能会使您感到困惑,但是它们是完全分开的,并且不共享任何变量。

同样, increment构造的闭包将捕获id值为0 six id0开始,递增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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM