1. 闭包

  • 定义:一个函数可以访问另一个函数内部的变量

  • 形成条件

  • 一个函数(fn1)的返回值是另一个函数(fn2)
  • fn2中调用了fn1内部的变量
  • fn2在外部执行了
  • 作用
  • 实现封装过程。封装对象中的变量不能直接访问,提过返回的getter/setter方法来访问。
  1. function Person() {
  2. var name = '张三';
  3. return {
  4. getName() {
  5. return this.name;
  6. },
  7. setName(value) {
  8. this.name = value;
  9. }
  10. }
  11. }
  • 模拟块级作用域
  1. function fn(num){
  2. for(var i=0; i<num; i++){}
  3. console.log(i);
  4. }
  5. fn(2); //2
  6. // 通过闭包模拟实现
  7. function fn(num){
  8. (function(){
  9. for(var i=0; i<num; i++){}
  10. })();
  11. console.log(i);
  12. }
  13. fn(2); //error "i is not defined"
  • 解决for循环的问题
  1. function fn(){
  2. for(var i=0; i<5; i++){
  3. setTimeout(function(){
  4. console.log(i);
  5. },i*1000);
  6. }
  7. }
  8. fn(); //每隔1s输出一次"5",共输出4次
  9. //原因:i是var声明的变量,在函数范围内有效,每次for循环全局变量的i都会改变,所有每次输出的都是同一个i
  10. // 通过闭包解决
  11. function fn(){
  12. for(var i=0; i<5; i++){
  13. (function(j){
  14. setTimeout(function(){
  15. console.log(j);
  16. },i*1000);
  17. })(i);
  18. }
  19. }
  20. fn(); //每隔1秒分别输出0 1 2 3 4