gpt4 book ai didi

javascript - 更新 JavaScript 函数中的静态变量

转载 作者:行者123 更新时间:2023-12-02 16:39:10 25 4
gpt4 key购买 nike

我已阅读了以下示例 7 的代码,该代码发布在 How do JavaScript Closures work? 的以下答案中

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。因此,使用相同的推理,我期望 14(8) 调用返回数字 14,因为我相信 ID 会更新为 6,而不是保持在 0。为什么该变量不是静态的?我如何解释它是静态的?

我还尝试让该函数设置一个数字参数并将 ID 设置为等于该参数,但也没有更新它。

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

最佳答案

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

同样,increment 构造的闭包将捕获 id 的值 0sixid0 开始,以 6 递增到 614 独立地从其自己的 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被外部闭包捕获,因此它被所有内部闭包共享; 计数器由内部闭包捕获并且对于外部闭包来说是本地的,因此它对于每个内部闭包都是独立的。

关于javascript - 更新 JavaScript 函数中的静态变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27651864/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com