gpt4 book ai didi

javascript - 了解 Javascript 中的闭包

转载 作者:数据小太阳 更新时间:2023-10-29 04:21:55 25 4
gpt4 key购买 nike

我正在努力研究 Javascript 中的闭包。

这是教程中的示例:

function greeter(name, age) {
var message = name + ", who is " + age + " years old, says hi!";

return function greet() {
console.log(message);
};
}

// Generate the closure
var bobGreeter = greeter("Bob", 47);

// Use the closure
bobGreeter();

作者说这是用闭包做私有(private)变量的有效方法,但是我没明白。

有人可以阐明这样编码的好处吗?

最佳答案

闭包 是一对函数 和定义它的环境(假设 lexical scoping,JavaScript 使用) .因此,闭包的函数可以访问其环境中的变量;如果没有其他函数可以访问该环境,那么其中的所有变量实际上都是私有(private)的,并且只能通过闭包函数访问。

您提供的示例很好地证明了这一点。我添加了内嵌注释来解释环境。

// Outside, we begin in the global environment.
function greeter(name, age) {
// When greeter is *invoked* and we're running the code here, a new
// environment is created. Within this environment, the function's arguments
// are bound to the variables `name' and `age'.

// Within this environment, another new variable called `message' is created.
var message = name + ", who is " + age + " years old, says hi!";

// Within the same environment (the one we're currently executing in), a
// function is defined, which creates a new closure that references this
// environment. Thus, this function can access the variables `message', `name',
// and `age' within this environment, as well as all variables within any
// parent environments (which is just the global environment in this example).
return function greet() { console.log(message); };
}

var bobGreeter = greeter("Bob", 47); 运行时,一个新的闭包被创建;也就是说,您现在已经有了一个新的函数实例以及创建它的环境。因此,您的新函数在所述环境中引用了“消息”变量,尽管其他人没有引用。

延伸阅读:SICP Ch 3.2 .虽然侧重于Scheme,但是思路是一样的。如果您很好地理解了本章,您将对环境和词法范围的工作原理打下良好的基础。

Mozilla 还有一个专用于 explaining closures 的页面.

关于javascript - 了解 Javascript 中的闭包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3903058/

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