在什么情况下反1比较好?在什么情况下计数器2会更好?
我明白当全局声明一个变量时,可能是不可预知的,但是否有一种情况会比在函数内部声明它更可取?
// counter1 code
function counterMaker() {
let count = 0;
return function counter() {
return count++;
};
}
// counter2 code
let count = 10;
function counter2() {
return count++;
}
你可以声明 count
变量,而不需要递增计数,就可以在外层作用域中引用它。
let count = 10;
function counter2() {
return count++;
}
counter2();
counter2();
console.log(count);
如果 count
变量在一个闭包里面,而闭包只暴露了返回的函数,那么上述方法就不可能了--唯一的选择是调用返回的函数,即使你只想检查它的当前值,它也会递增计数。
第一个方法中 count
只能由 counter
如果您想让消费者清楚地了解 counterMaker
并对守则的读者说 count
变量是 预期 是私有的(外部完全无法访问)。
当你想创建一个名为 多个实例 的计数器,而第二种方法不会(除非你每次想要一个计数器时都重复一个计数器变量和函数,这很傻)。
解释计数器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会被调用,它只会增量什么。
我认为在这种情况下,通过闭包访问变量比访问外部变量更可取。对外部变量的访问会产生副作用,你的函数会依赖于外部发生的变化,而且这些变化可能是不可预测的。或者,将来你想移动这个函数,你仍然需要监控这个外部变量。我认为,所有的外部依赖都应该通过参数传递给函数。