关于javascript:JavaScript-闭包是什么深入了解

7次阅读

共计 2244 个字符,预计需要花费 6 分钟才能阅读完成。

闭包是指在一个函数外部创立另一个函数,并且外部函数能够拜访内部函数的变量、参数以及其余外部函数,即便内部函数曾经执行结束。这种机制使得外部函数保留了对外部作用域的援用,即便内部作用域曾经不再沉闷。

为什么闭包重要?

闭包在 JavaScript 中具备重要的用处和价值。它们能够用于创立公有变量、封装逻辑、防止全局净化等方面。另外,闭包还容许你在函数之外操作局部变量,从而为代码提供更大的灵活性和可维护性。

JavaScript 闭包的特点

  • 闭包能够拜访内部函数的变量,即便内部函数曾经返回了。
  • 闭包保留内部函数变量的援用,而不是理论的值。
  • 每当一个函数在另一个函数中被创立时,就会产生闭包。

JS 闭包的用处

闭包常被用于:

  • 封装 – 外部函数能够拜访内部变量, 但内部函数不能拜访外部变量。这提供了封装和数据私密性。
  • 状态继续 – 闭包能够在函数调用之间放弃状态 (例如计数器)。函数的变量在调用之间继续存在。
  • 偏函数利用 – 闭包能够用于偏函数利用和柯里化函数。这波及到创立一个捕捉一些参数但保留其余参数未设置的函数。

JS 闭包的类型

1. 一般闭包

一般闭包是指一个函数外部定义了另一个函数,并且外部函数援用了内部函数的变量。这种状况下,外部函数会捕捉内部函数的变量,并能够在内部函数执行结束后持续应用。

  var outerVar = 'I am from outer';
  
  function inner() {console.log(outerVar);
  }
  
  return inner;
}

var closureFunction = outer();
closureFunction(); // 输入:I am from outer

2. 立刻调用函数表达式(IIFE)闭包

IIFE 是一种创立闭包的常见模式。通过将函数定义包裹在括号内并立刻调用它,你能够创立一个在执行后依然具备拜访内部作用域的函数。

  var privateVar = 'I am private';
  
  return function() {console.log(privateVar);
  };
})();

closureFunction(); // 输入:I am private

实际案例:计数器闭包

让咱们通过一个理论案例来进一步了解闭包的利用。思考一个简略的计数器,能够通过闭包来实现:

  var count = 0;
  
  return function() {return ++count;};
}

var counter = createCounter();
console.log(counter()); // 输入:1
console.log(counter()); // 输入:2
console.log(counter()); // 输入:3

互动练习

1. 创立一个闭包函数,用于计算累加和。函数初始值为 0,每次调用会将参数值累加到外部变量中。 参考答案:

  var sum = 0;

  return function(value) {
    sum += value;
    return sum;
  };
}

var sumCalculator = createSumCalculator();
console.log(sumCalculator(5)); // 输入:5
console.log(sumCalculator(10)); // 输入:15
console.log(sumCalculator(2)); // 输入:17

2. 创立一个 IIFE 闭包,用于生成斐波那契数列的下一个值。斐波那契数列起始为 0 和 1,后续每个数字是前两个数字之和。 参考答案:

  var a = 0;
  var b = 1;

  return function() {
    var next = a + b;
    a = b;
    b = next;
    return next;
  };
})();

console.log(fibonacciGenerator()); // 输入:1
console.log(fibonacciGenerator()); // 输入:2
console.log(fibonacciGenerator()); // 输入:3

注意事项

  • 闭包会导致内存透露,因为闭包保留了对外部作用域的援用,导致内部作用域的变量无奈被垃圾回收机制开释。
  • 留神应用闭包时的作用域链,防止意外援用到不须要的变量。
  • 闭包不仅在浏览器中有用,在 Node.js 服务器端编程中也常常应用。

通过 API 工具调试后端接口

Apifox 是一个比 Postman 更弱小的接口测试工具,Apifox = Postman + Swagger + Mock + JMeter,Apifox 反对调试 http(s)、WebSocket、Socket、gRPC、Dubbo 等协定的接口,并且集成了 IDEA 插件 。在后端人员写完服务接口时,测试阶段能够通过 Apifox 来校验接口的正确性,图形化界面极大的不便了我的项目的上线效率。

总结

闭包是 JavaScript 中一个弱小且乏味的概念,容许外部函数拜访内部作用域中的变量和数据。通过创立闭包,你能够实现公有性、封装性以及更高级的编程技巧。理解闭包的工作原理并在理论我的项目中利用它们,将使你的 JavaScript 代码更加优雅和功能强大。

常识扩大:

  • JavaScript(JS)中怎么遍历数组?一文解说 JS 遍历数组的办法
  • JavaScript(JS)中怎么遍历对象?一文解说 JS 遍历对象的办法

参考链接:

  • MDN Web Docs: Closures:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Closures
  • JavaScript.info: Closures:https://javascript.info/closure
正文完
 0