【问题标题】:Which scenario of Javascript closure is preferred?首选哪种 Javascript 闭包场景?
【发布时间】:2020-09-02 12:15:43
【问题描述】:
在什么情况下 counter1 更可取?在什么情况下计数器 2 会更好?
我知道在全局声明变量时可能无法预测,但是否存在比在函数内声明它更可取的情况?
// counter1 code
function counterMaker() {
let count = 0;
return function counter() {
return count++;
};
}
// counter2 code
let count = 10;
function counter2() {
return count++;
}
【问题讨论】:
标签:
javascript
variables
scope
closures
counter
【解决方案1】:
如果您希望在其他地方引用 count 变量,您可以在外部范围内声明它,而不必增加计数:
let count = 10;
function counter2() {
return count++;
}
counter2();
counter2();
console.log(count);
如果count 变量在闭包内,并且闭包只公开返回的函数,则上述方法是不可能的 - 唯一的选择是调用返回的函数,即使您只想检查也会增加计数它的当前值。
如果您想让counterMaker 的使用者和count 变量的代码读者清楚地知道count 只能由闭包中的counter 函数查看,那么第一种方法会很有用打算是私有的(并且在外部完全无法访问)。
当您想要创建计数器的多个实例时,第一种方法也可以工作,而第二种方法则不会(除非您每次需要一个计数器时都重复一个计数器变量和函数,这是愚蠢的)。
【解决方案2】:
计数器 1 代码说明。
// counter1 code
function counterMaker() {
let count = 0;
return function counter() {
return count++;
};
}
在这里,您将一个函数返回给调用者。所以可以在调用者处做这样的事情。
var c = counterMaker()
c() //0
c() //1
c() //1
var b = counterMaker()
b() //0
b() //1
b() //1
因为您尝试使用函数表达式时尝试封闭该函数和变量环境。所以你的增量功能不会暴露在外面。如果这是有道理的,那么你就会明白为什么要关闭以及在哪里关闭的全部简洁性。
代码2说明
// counter2 code
let count = 10;
function counter2() {
return count++;
}
您正在尝试将增量函数公开到全局中,现在您将无法像上面的代码 1 那样创建多个实例。因此,每次调用函数 counter2 时,它只会增加什么。
【解决方案3】:
我认为在这种情况下,通过闭包访问变量比访问外部变量更可取。访问外部变量会产生副作用,你的函数变得依赖于它之外发生的变化,而且它们可能是不可预测的。或者,将来您要移动此函数,您仍需要监视此外部变量。我认为所有的外部依赖都应该通过参数传递给函数。