我对以下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)
我不明白为什么计数器和计数器 2 中的 i 变量不是指相同的 i 值?
我的理解是,计数器和计数器 2 应该引用相同的函数,因为两者都被分配了相同的函数,并且函数是"引用数据类型",不应该创建单独的副本。
另外,计数器和计数器 2 如何访问 makecounter 函数中设置的"私有"值?
i
是makeCounter
的本地。
每次调用该函数时,您都会获得一个新i
。
在该函数中定义的匿名函数可以访问i
,因为它是在 makeCounter
中定义的。
该函数被返回,因此它在makeCounter
外部可用,但由于定义它的位置,它仍然可以访问i
。
我的理解是计数器和计数器2应该引用相同的函数,因为两者都被分配了相同的函数
它们没有被分配相同的功能。每次调用makeCounter
时都会创建一个新函数。
你需要了解的一件事是Javascript使用静态作用域。因此,变量 i 仅在 makeCounter 函数范围内可用。
当你调用makeCounter()时,它将i初始化为0并返回一个新的函数对象。对于每个函数对象,都有自己的 i 实例。