乐趣区

关于javascript:闭包的三个条件

众所知周,在 javascript 中,函数内部的变量是不可能间接拜访函数外部的变量的比方:

var c = 20;

 function fn(){
    var a =1;
    var b = 2;
    console.log(a);            此处是能够打印拜访这个局部变量的;
    console.log(c);            此处是能够打印访   问内部 c 这个全局变量的,*** 于是此处先在函数内找是否有部分的变量 c,如果没有便会顺则作用域链向内部寻找变量,于是找到了全     局变量 c 于是能够拜访了 ***

}
fn()

ok 接下来咱们能够看看上面这个函数是否在内部拜访外面的变量

function fn(){
var b = 3;
}
fn()
console.log(b); 此处是打印不进去的,
因为当初打所处的是全局的环境,所以全局无奈间接拜访一个函数外部的变量的,因 此咱们在想是否能够有一个办法能够在内部调并且应用函数外部的表变量呢?

这时候闭包的作用就产生了:

闭包的定义:

  是 JavaScript 中, 函数的一种高级利用形式

 function fn(){console.log("我是函数 fn");
  ]
  fn()  函数执行时候会开拓一个执行空间,(暂且叫他 xxff00)

console.log(“ 我是函数 fn”); 这段代码就是在 xxff00 这个空间中执行的,
代码执行当前,这个 xxff00 空间就会销毁, 既然销毁了,那外面的变量也会随之而删除。

于是在想能不能建设一个不被销毁的空间呢?
不被销毁的执行空间的
1. 函数的返回值, 是一个援用数据类型
2. 援用数据类型能够是对象、数组、函数等
3. 并且在函数的内部, 有变量, 援用这个函数

于是闭包的三个必备条件就来了
在一个函数 A(暂且叫 A) 的外面 return 出也就是抛出一个函数 B

1 有一个函数 A , 在函数 A 外部返回一个函数 B

function A(){
                 var num  =100;
                      return functionB(){         // 返回值函数 B
                                  var num1 = num;
                               console.log(num1)
                              return num1;
                       } 
      }

2 在函数 B 中拜访函数 A 的公有作用域变量

function A(){
                 var num  =100;
                      return functionB(){         // 返回值函数 B
                                  var num1 = num;    // 在函数 B 中拜访函数 A 的局部变量
                               console.log(num1)
                              return num1;   
                       } 
      }

3 在函数 A 内部, 有变量援用函数 B

var fn1 = A();   // 此处调用函数 A, 执行的后果就是函数 B
 var fn2 =fn1();  // 此处调用函数 fn1(), 执行后果就是援用函数 B 
退出移动版