gpt4 book ai didi

javascript - JavaScript 闭包如何处理变量?

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:34:51 24 4
gpt4 key购买 nike

假设我们有一个 containerFunction,其中定义了两个函数:

var innerFunction1link;
var innerFunction2link;

function containerFunction() {
var someInnerVariable = 1;

innerFunction1link = innerFunction1;
innerFunction2link = innerFunction2;

function innerFunction1() {
console.log("I'm 1 " + someOuterVariable + " " + (someInnerVariable++));
}

function innerFunction2() {
console.log("I'm 2 " + someOuterVariable + " " + (someInnerVariable++));
}
}


containerFunction();
var someOuterVariable = 42;

// Point A
innerFunction1link();
innerFunction2link();

someOuterVariable = "WAT?!";

// Point B
innerFunction1link();
innerFunction2link();

现在是问题。根据“Secrets of The JavaScript Ninja”一书,每个闭包都有自己的私有(private)变量集(包括后面定义的变量,如 someOuterVariable):

private bubbles

因此 innerFunction1innerFunction2containerFunction 之外被引用为 innerFunction1linkinnerFunction2link将有他们的“私有(private)泡沫”,其中包含全套变量。在“A 点”,两个函数都将正常执行并输出:

I'm 1 42 1
I'm 2 42 2

然后,当我将 someOuterVariable 设置为 "WAT?!" 时,输出为:

I'm 1 WAT?! 3
I'm 2 WAT?! 4

someOuterVariablesomeInnerValue 的值如何在两个“私有(private)气泡”中实际更新(如果有 1000 个这些气泡会怎样)?它真的跟踪所有变量的所有引用吗?如果一个闭包更新了 someOuterVariable,它的值将如何填充到其他闭包?

更新:

即使 innerFunction 将在不同的上下文中定义,它们仍然会“共享”变量:

function containerFunction1() {
var someInnerVariable = 1;

innerFunction1link = innerFunction1;

function innerFunction1() {
console.log("I'm 1 " + someOuterVariable + " " + (someInnerVariable++));
}
}

function containerFunction2() {
var someInnerVariable = 1;

innerFunction2link = innerFunction2;
function innerFunction2() {
console.log("I'm 2 " + someOuterVariable + " " + (someInnerVariable++));
}
}

containerFunction1();
containerFunction2();
var someOuterVariable = 42;

innerFunction1link();
innerFunction2link();

someOuterVariable = "WAT?!";

innerFunction1link();
innerFunction2link();

输出:

I'm 1 42 1 
I'm 2 42 1
I'm 1 WAT?! 2
I'm 2 WAT?! 2

最佳答案

比使用私有(private)气泡更好的描述是每个函数都保留对其定义范围的引用。

必须清楚它是引用,而不是副本

这解释了两个 innerFunctions 指向同一范围,因此指向同一组变量。这些变量也可以在外部范围内或通过指向该范围的任何函数进行更改。

作为补充说明:每次调用函数时都会在 JavaScript 中创建一个作用域(还有其他作用域,最著名的是全局作用域,但也可以使用 withtry/catch).

关于javascript - JavaScript 闭包如何处理变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17429745/

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