工厂函数:根据不同的输入生成不同的函数。
function outer() { let outerVariable = '我是外层函数的变量'; function inner() { console.log(outerVariable); } return inner; } const innerFunction = outer(); innerFunction(); // 输出:我是外层函数的变量在这个例子中,outer函数内部定义了一个inner函数,这个inner函数能够访问outer函数中的outerVariable变量。即使outer函数已经执行完毕,inner函数仍然能够访问并打印出outerVariable变量的内容。
function createCounter() { let count = 0; return function() { count++; return count; }; } const counter = createCounter(); console.log(counter()); // 输出:1 console.log(counter()); // 输出:2 console.log(counter()); // 输出:3在这个例子中,count变量被定义在createCounter函数内部,并且只能通过返回的函数来访问和修改。即使createCounter函数已经执行完毕,count变量仍然可以通过闭包机制被访问。这就像储钱罐里的钱只能通过特定的开口增加,确保了数据的隐私和安全。通过这种方式,我们可以有效地保护变量不被外部直接修改,同时还能灵活地操作这些变量。这是闭包在实际编程中的一个重要应用。
function createAdder(x) { return function(y) { return x + y; }; } const add5 = createAdder(5); console.log(add5(2)); // 输出:7 console.log(add5(10)); // 输出:15 const add10 = createAdder(10); console.log(add10(2)); // 输出:12 console.log(add10(10)); // 输出:20在这个例子中,createAdder函数生成了新的函数,这些新函数会把特定的值加到它们的输入上。createAdder(5)生成了一个每次调用都加5的函数,而createAdder(10)生成了一个每次调用都加10的函数。
function attachEventHandler(element, message) { element.addEventListener('click', function() { alert(message); }); } // 堆代码 duidaima.com const button = document.querySelector('button'); attachEventHandler(button, '按钮被点击了!');在这个例子中,attachEventHandler函数接受一个元素和一个消息作为参数。当元素被点击时,事件处理程序会弹出一个提示框显示消息。通过闭包机制,事件处理函数保留了对message变量的访问权限,因此可以在点击按钮时显示正确的消息。
function createIterator(array) { let index = 0; return function() { if (index < array.length) { return array[index++]; } else { return null; } }; } const iterator = createIterator([1, 2, 3]); console.log(iterator()); // 输出:1 console.log(iterator()); // 输出:2 console.log(iterator()); // 输出:3 console.log(iterator()); // 输出:null在这个例子中,createIterator函数接受一个数组作为参数,并返回一个闭包函数。这个闭包函数每次调用时,都会返回数组中的下一个元素。当数组遍历完毕后,它会返回null。通过闭包机制,返回的函数保留了对index变量的访问权限,因此能够正确地逐一遍历数组。这就像你在阅读一本故事书,每次只看到一页内容,直到看完所有的页数。闭包机制确保你可以记住当前看到的页数,并且能够在每次阅读时接着上次的进度继续。
function createFunction() { let message = 'Hello, World!'; return function() { console.log(message); }; } let myFunction = createFunction(); myFunction(); // 输出:Hello, World! // 堆代码 duidaima.com // 现在我们不再需要 myFunction myFunction = null; // 解除引用 // 此时,闭包中的 message 变量可以被垃圾回收器清理在这个例子中,createFunction返回了一个闭包函数,该闭包函数引用了message变量。当我们第一次调用myFunction时,它会输出Hello, World!。当我们不再需要myFunction时,可以通过将myFunction设置为null来解除对它的引用。这样,闭包中的message变量就没有任何引用了,垃圾回收器就可以清理掉它,从而释放内存。