gpt4 book ai didi

具有两个实例化的 Javascript 闭包

转载 作者:行者123 更新时间:2023-11-30 15:51:52 26 4
gpt4 key购买 nike

我试图理解闭包,并尝试使用以下代码。我希望 i 的值在所有对象中都相同,因为闭包保留对外部函数变量的引用。

 function Test(){
var i=10;
return{
get:function(){return i;},
inc:function(){i++;}
}
}
var test1= Test();
var test2=Test();
test1.get(); //outputs 10
test1.inc();
test2.get(); //outputs 10, I am expecting it to be 11

我对闭包的理解是否正确,我什至在这种情况下创建了一个闭包吗?我是闭包的新手,详细的解释会很好。谢谢。

最佳答案

正如其他人所提到的,您基本上已经创建了两个闭包。

理解闭包最简单的方法是它是全局变量概念的概括。实际上,javascript中的全局变量无非就是全局范围内的闭包。

闭包是函数体可以引用外部范围内变量的机制。正如我上面所说,全局变量只不过是一个闭包:

var x;

function x_plus_plus () {
x++; // this variable is captured by a closure
}

每个作用域都允许您创建一个闭包。因此,除了全局作用域之外,您还可以在其他函数中创建闭包。就我个人而言,最能说明什么是闭包的最小示例代码是一个 IIFE,它定义了两个共享一个变量的函数:

var incr;
var val;

(function(){
var x = 0; // shared with the functions below var via closure

incr = function(){x++};
val = function(){return x};
})();

incr();
incr();
console.log(val()); // outputs 2 because the functions share x

console.log(x); // syntax error - x does not exist in this scope

请注意,闭包是变量和在该变量范围内声明的函数之间发生的事情。这不是变量和声明该变量的函数之间发生的事情:

function () {  <─────┐
├── this is not a closure
var foo; <───────┘
}

function () {
var foo; <────────────────┐
├── this is a closure
function bar () { │
do_something(foo); <───┘
}
}

var x; <───────────────┐
├── this is also a closure but we
function y () { │ normally call it "global variable"
do_something(x); <───┘
}

Side note: Global variables in js are actually a bit unique because they're also properties of the global (window) object. But in theory they behave as if they're an instance of a closure. The point is that thinking of closures as a global-variable-like mechanism is the easiest way to understand them.

关于具有两个实例化的 Javascript 闭包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39200153/

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