javascript闭包

176 阅读2分钟

目标

  • 理解闭包是什么,闭包不是什么
  • 使用闭包来模拟私有变量
  • js闭包用例

闭包定义

外部函数执行之后被返回,内部函数还可以使用外部函数定义的变量,我们把这个函数叫做闭包

  function outer(a) {
    return function inner(b) {
      // 这个内部函数在使用变量a,
      // a是在outer函数里面定义的
      // 当inner函数被调用的时候, outer函数已经被返回了,但是inner还是可以访问a
      // 我们把这个inner叫做闭包
      return a + b;
    }
  }
  outer(5)(5); //10
  var storeOuter = outer(5)
  storeOuter(10); //15

小测试

  //  这是一个闭包么
  function outerFn(){
    var data = "something from outer";
    return function innerFn(){
        return "Just returned from the inner function";
    }
}
// 不是

// 下面这个呢,是闭包么
function outerFn(){
    var data = "something from outer";
    return function innerFn(){
        return "Just returned from the inner function";
    }
}
function outerFn(){
    var data = "something from outer";
    return function innerFn(){
        var innerData = "something from inner";
        return data + " " + innerData;
    }
}
// 是的 为什么呢?因为一个闭包只在这种情况下存在,就是当这个内部函数可以访问外部函数定义的变量并且这个外部函数已经被返回了的时候。如果内部函数不使用任何外部变量,那么这是一个嵌套函数

闭包是如何工作的

只有在内部函数中使用的变量被记住

  function outerFn(){
    var data = "something from outerFn";
    var fact = "Remember me!";
    return function innerFn(){
      // 在控制台下运行
	    debugger 
        return fact;
    }
}

var outer = outerFn();
outer();

控制台运行结果

闭包不记得外部函数的所有内容——只会记住它们需要使用的变量! (fact会被记住, data不会被记住)

闭包的使用途径 ---私有变量

function counter(){
    var count = 0;
    return function(){
        count++;
        return count;
    }
}
var counter1 = counter();
counter1(); // 1
counter1(); // 2

var counter2 = counter();
counter2(); // 1
counter2(); // 2

counter1(); // 3 不会被counter2影响!

count; // ReferenceError: count is not defined - 私有的!
  function classRoom(){
    var instructors = ["Elie", "Colt"];
    return {
        getInstructors: function(){
            return instructors.slice();
        },
        addInstructor: function(instructor){
            instructors.push(instructor);
            return instructors.slice();
        }
    }
}

总结

1.当外部函数被返回,内部函数还能够访问外部函数定义的变量的时候,闭包就会存在

2.如果不返回内部函数,如果内部函数不使用外部函数返回的变量,则闭包不存在

3.JavaScript只会记住内部函数中使用的变量,而不是外部函数中定义的所有变量

4.我们可以使用闭包来创建私有变量,并编写更好的代码来隔离我们的逻辑和应用程序