众所知周,在javascript中,函数外部的变量是不能够直接访问函数内部的变量的比如:
var c = 20;
function fn(){
var a =1;
var b = 2;
console.log(a); 此处是可以打印访问这个局部变量的;
console.log©; 此处是可以打印访 问外部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