 闽公网安备 35020302035485号
                
                闽公网安备 35020302035485号
                工厂函数:根据不同的输入生成不同的函数。
	
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变量就没有任何引用了,垃圾回收器就可以清理掉它,从而释放内存。