gpt4 book ai didi

javascript - 无法理解 Javascript 闭包示例

转载 作者:行者123 更新时间:2023-12-01 02:53:43 25 4
gpt4 key购买 nike

我理解闭包的大部分内容,但是这个例子让我很困惑。我将发布两个代码示例:第一个是原始引用,其中解释了闭包的工作原理,第二个是我添加了一些内容的代码,但它没有给我预期的结果。

这是他们给出的解释:

This final example shows that each call creates a separate closure for the local variables. There is not a single closure per function declaration. There is a closure for each call to a function.

实际代码:

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);
console.log('num: ' + num +
'; anArray: ' + anArray.toString() +
'; ref.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;

现在,我不明白为什么 obj.someVar++ 更改了最后两行的结果,并且以下添加 num++ 不会将最后两个 num 结果更改为 8 和 9,而不是 7 和 8。有什么区别?

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);
console.log('num: ' + num +
'; anArray: ' + anArray.toString() +
'; ref.someVar: ' + ref.someVar + ';');
}
}
num = 4
obj = {someVar: 4};
fn1 = newClosure(num, obj);
fn2 = newClosure(num+1, 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;
num++
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;

有人可以向我解释一下吗?

最佳答案

  1. 为什么obj.someVar++会改变最后两行的结果?

    因为函数中的ref是对象的引用。您更改了 obj.someVar,因此以下日志反射(reflect)了该更改。

  2. 为什么下面的 num++ 相加不会将最后两个 num 结果更改为 8 和 9,而不是 7 和 8?

    由于您使用了关键字 varnum 变量与外部变量不同。 JavaScript 是函数作用域的,它们引用不同的值。

<小时/>

我知道困惑从何而来。您尝试传递 someNumsomeRef 并对它们执行“相同”操作(增量),但您得到了不同的行为。

您必须意识到的一件事是,num 的值是原始值 4,而 obj 的值是引用(类似于 C 中的指针)。将引用视为指示内存地址的数字(但不完全是数字)。当您将它们传递给函数时,这些值将被复制:

  • 对于 num,将复制值 4
  • 对于 obj,将复制值(在本例中为引用)。

由于复制引用不会创建新对象,因此当您在函数外部更改值 obj.someVar 时,更改将反射(reflect)在函数中,因为它仍然引用同一个对象。

关于javascript - 无法理解 Javascript 闭包示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46840899/

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