JavaScript必备小知识-闭包的理解

310 阅读1分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

32-闭包

1.闭包的概念:

  闭包就是一个函数,两个函数彼此嵌套,内部函数就是闭包形成闭包条件是内部函数需要通过return给返回出来。

  看下面的代码,你就懂了:
function f1() {
  function f2() {
    alert('我是js闭包!')
  }
  return f2
}
var f = f1()
f() //弹出:我是js闭包!

2. 闭包特点

闭包有权利调用其上级环境的变量信息。父级环境的信息已经固化为本身 AO 的成员了。

看下代码,更好理解:

function f1() {
  var bb = '闭包'
  function f2() {
    alert('我是' + bb)
  }
  return f2
}
var f = f1()
f() //弹出:我是js闭包

3. 闭包使用规则

同一个闭包机制可以创建多个闭包函数出来,它们彼此没有联系,都是独立的。

并且每个闭包函数可以保存自己个性化的信息。

看下代码,理解下三个闭包彼此独立、没有联系:

function f1(num) {
  function f2() {
    alert('数字:' + num)
  }
  return f2
}
var fa = f1(10)
var fb = f1(20)
var fc = f1(30)
fa() //数字:10
fb() //数字:20
fc() //数字:30

4. 闭包的使用例子,加深理解闭包

  //创建数组元素
      var num = new Array();
      for(var i=0; i<4; i++){
          //num[i] = 闭包;//闭包被调用了4次,就会生成4个独立的函数
          //每个函数内部有自己可以访问的个性化(差异)的信息
          num[i] = f1(i);
      }
      function f1(n){
          function f2(){
              alert(n);
          }
          return f2;
      }
      num[2]();  //2
      num[1]();  //1
      num[0]();  //0
      num[3]();  //3
    */

  function foo() {
    var i = 1;
    return function () {
      i++;
      console.log(i);
    }
  }
  var aFn = foo(), bFn = foo();
  aFn(); // 2
  aFn(); // 3
  bFn(); // 2

//--------------------------------------------------->

function funca() {
  y = function () {
    X = 2
  }
  return function () {
    var x = 3
    y()
    console.log(this.x) // 3
  }.apply(this, arguments)
}
funca() //undefined