3 回答
TA贡献2011条经验 获得超2个赞
如果您希望变量在其他位置可引用,则可以在外部作用域中声明该变量,而不必增加计数:count
let count = 10;
function counter2() {
return count++;
}
counter2();
counter2();
console.log(count);
如果变量位于闭包内,并且闭包仅公开返回的函数,则上述操作是不可能的 - 唯一的选择是调用返回的函数,即使您只想检查其当前值,该函数也会递增计数。count
第一种方法,其中只能由闭包中的函数查看,如果你想向代码的使用者和读者清楚地表明变量是私有的(并且在外部完全不可访问),这将是有用的。countcountercounterMakercount
当您想要创建计数器的多个实例时,第一种方法也可以工作,而第二种方法则不行(除非您每次需要计数器时都重复计数器变量并运行函数,这很愚蠢)。
TA贡献1883条经验 获得超3个赞
计数器 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 时,它只会增加 whatsover。
TA贡献1842条经验 获得超12个赞
我认为在这种情况下,通过闭包访问变量比访问外部变量更可取。访问外部变量会产生副作用,您的函数依赖于在其外部发生的变化,并且它们可能是不可预测的。或者,将来,您将要移动此函数,您仍然需要监视此外部变量。我认为所有外部依赖关系都应该通过参数传递给函数。
添加回答
举报