封装私有变量
闭包可以用于创建具有私有变量的模块化代码。通过将变量定义在外部函数内部,并将内部函数返回,可以创建一个封闭的作用域,使变量无法从外部直接访问。这样可以有效地隐藏变量,只暴露出需要被外部访问的接口。
代码语言:javascript复制function counter() {
var count = 0;
return {
increment: function() {
count ;
},
decrement: function() {
count--;
},
getCount: function() {
return count;
}
};
}
var myCounter = counter();
myCounter.increment();
console.log(myCounter.getCount()); // 输出: 1
在这个示例中,counter
函数返回一个包含三个方法的对象。这些方法可以操作私有变量count
,但无法从外部直接访问。
保存状态
闭包可以用于保存函数的状态。当函数被调用时,它可以访问并修改闭包中的状态,从而实现在多次调用之间保持数据的连续性。
代码语言:javascript复制function createTimer() {
var startTime = Date.now();
return function() {
return Date.now() - startTime;
};
}
var timer = createTimer();
console.log(timer()); // 输出: 运行时间(毫秒)
// 做一些其他的操作
console.log(timer()); // 输出: 运行时间(毫秒)
在这个示例中,createTimer
函数返回一个内部函数,它计算从创建时到调用时的时间差。每次调用timer
函数时,它都会返回自创建以来的时间差,从而实现保存状态的效果。
迭代器
闭包可以用于实现迭代器模式,通过保留内部状态和索引来追踪迭代过程。
代码语言:javascript复制function createIterator(array) {
var index = 0;
return {
next: function() {
if (index < array.length) {
return { value: array[index ], done: false };
} else {
return { done: true };
}
}
};
}
var myArray = [1, 2, 3];
var iterator = createIterator(myArray);
console.log(iterator.next()); // 输出: { value: 1, done: false }
console.log(iterator.next()); // 输出: { value: 2, done: false }
console.log(iterator.next()); // 输出: { value: 3, done: false }
console.log(iterator.next()); // 输出: { done: true }
在这个示例中,createIterator
函数接受一个数组作为参数,并返回一个包含next
方法的对象。每次调用next
方法时,它会返回数组中的下一个元素,并在迭代结束时返回done: true
。