// 因为返回的函数有权访问私有变量 `i`
function makeCounter() {
// `i` 只能在 `makeCounter`内被访问.
var i = 0;
return function() {
console.log( ++i );
};
}
// 注意 `counter` 和 `counter2` 都有私有的作用域 `i`.
var counter = makeCounter();
counter(); // logs: 1
counter(); // logs: 2
var counter2 = makeCounter();
counter2(); // logs: 1
counter2(); // logs: 2
i; // ReferenceError: i 未定义 (只存在 makeCounter 内部)
counter === counter2
会得到false
,他们根本是两个不同的函数,只不过行为一致。抛开
return
语句不看,makeCounter()
每次运行的时候会产生一个局域变量i
,所以多次运行的i
并不是同一个变量。局部变量,这个好理解吧?同理,每次
return
后面的function
也是局部引用的,每次调用makeCounter()
都会产生不同的函数表达式对象。由于每次产生的函数和对应的i
在同一个作用域,所以这个函数可以访问对应的i
。return
的结果是把函数表达式的引用返回出来,分别由counter
和counter2
两个变量存储了,所以counter
和counter2
指向的是同不的函数表达式对象,而它们使用的i
也是不同的。