我对以下JavaScript代码感到困惑:
// Because this function returns another function that has access to the
// "private" var i, the returned function is, effectively, "privileged."
function makeCounter() {
// `i` is only accessible inside `makeCounter`.
var i = 0;
return function() {
console.log( i++ );
};
}
// Note that `counter` and `counter2` each have their own scoped `i`.
var counter = makeCounter();
counter(); // logs: 1
counter(); // logs: 2
var counter2 = makeCounter();
counter2(); // logs: 1
counter2(); // logs: 2
i; // ReferenceError: i is not defined (it only exists inside makeCounter)
我不明白为什么计数器和 counter2 中的i变量不是指同一个 i 值?
我的理解是counter和counter2应引用相同的函数,因为两者都被赋予了相同的函数,而函数是“引用数据类型”,不应该创建单独的副本。
此外,计数器和 counter2 如何访问makecounter函数中设置的“private”值?
答案 0 :(得分:2)
i
位于makeCounter
的本地。
每次调用该函数时,您都会获得一个新的i
。
该函数内定义的匿名函数可以访问i
,因为它是在makeCounter
内定义的。
该函数已返回,因此可在makeCounter
之外使用,但仍可访问i
,因为它已定义。
我的理解是计数器和计数器2应该引用相同的函数,因为它们都被分配了相同的函数
他们没有被分配相同的功能。每次调用makeCounter
时都会创建一个新函数。
答案 1 :(得分:0)
您需要了解的一件事是Javascript使用静态作用域。因此变量i仅在makeCounter函数的范围内可用。
当你调用makeCounter()时,它将i初始化为0并返回一个新的函数对象。并且对于每个函数对象都有自己的i实例。