关于关闭的问题?这是伪闭包的一种形式吗?如果是,为什么要对此使用函数闭包?
Question regarding closures? Is this a form of pseudo-closure, if so, why use function closures over this?
我目前正在学习 JS,试图了解闭包及其用途。我知道它们对于避免污染全局范围很有用,但后来我意识到,下面的代码是不是基本上与不使用函数的闭包相同?我不确定我是否错过了闭包的要点,所以如果有更多知识的人可以验证这是一个闭包,如果是,为什么使用函数更好。
log = console.log;
dir = console.dir;
{
let x = 0;
function testFunc() {
log(++x);
}
}
let func = testFunc;
testFunc();
我想您正在将您的代码与以下内容进行比较:
log = console.log;
let func = function() {
let x = 0;
function increment() {
log(++x);
}
return increment;
}();
func();
func();
你的代码确实是等价的。在 EcmaScript 2015(也称为 EcmaScript 6)中将 let
变量声明添加到 JavaScript 之前,使用了旧样式。这增加了创建范围为块而不是整个函数的变量的能力。
如果您更改版本以使用 var x = 0;
,x
变量会污染全局范围。
闭包通常在其他函数中的另一个原因是您可以创建它们的动态数量。
function create_counter(start = 0) {
return function() {
return start++;
}
}
counter1 = create_counter();
counter2 = create_counter(5);
console.log(counter1());
console.log(counter1());
console.log(counter2());
console.log(counter2());
我目前正在学习 JS,试图了解闭包及其用途。我知道它们对于避免污染全局范围很有用,但后来我意识到,下面的代码是不是基本上与不使用函数的闭包相同?我不确定我是否错过了闭包的要点,所以如果有更多知识的人可以验证这是一个闭包,如果是,为什么使用函数更好。
log = console.log;
dir = console.dir;
{
let x = 0;
function testFunc() {
log(++x);
}
}
let func = testFunc;
testFunc();
我想您正在将您的代码与以下内容进行比较:
log = console.log;
let func = function() {
let x = 0;
function increment() {
log(++x);
}
return increment;
}();
func();
func();
你的代码确实是等价的。在 EcmaScript 2015(也称为 EcmaScript 6)中将 let
变量声明添加到 JavaScript 之前,使用了旧样式。这增加了创建范围为块而不是整个函数的变量的能力。
如果您更改版本以使用 var x = 0;
,x
变量会污染全局范围。
闭包通常在其他函数中的另一个原因是您可以创建它们的动态数量。
function create_counter(start = 0) {
return function() {
return start++;
}
}
counter1 = create_counter();
counter2 = create_counter(5);
console.log(counter1());
console.log(counter1());
console.log(counter2());
console.log(counter2());