闭包:从一函数外部访问这一函数的内部函数,从而使这一函数内部变量持续存在的实现
闭包的特性:
函数嵌套函数
内部函数引起外部函数中变量的变化
参数和变量不会被垃圾回收机制回收
首先,先来观察一个简单的闭包
function fn(){
var a = 1;
return function(){ //核心代码1
a++;
console.log(a);
}
}
var carry = fn(); //核心代码2
carry(); //2
carry(); //3
1
2
3
4
5
6
7
8
9
10
核心代码1:
fn 函数执行完毕后把一个匿名函数当作返回值返回出来。
核心代码2:
var carry = fn(); 此行代码将 fn() 传递给变量 carry . 无论是在 Java 还是JavaScript中把一个带有返回值的方法传递给一个变量,那么传递的实质便是此变量等同于方法的返回值,即 carry 等于返回的匿名函数
carry = function(){ a++; console.log(a); }
既然 carry 等同于匿名函数,那么对于 carry 来说变量 a 即相当于一个全局变量,为了方便理解可以这样考虑:
在这里插入图片描述
对于 js 来说函数是可以随意嵌套的,那么全局变量也只是相对而言,就像上图中对于内涵函数 carry 来说 a 变量就是一个全局变量,如果只执行 carry 那么 a 就不会被重新定义,而是同全局变量一样保存在内存里。这样就可以实现闭包。
闭包的其他实现方式
IIFE:Immediately Invoked Function Expression,意为立即调用函数表达式。
简介:如果有些函数只使用一次,那么立即执行就可以,连函数名都省掉,就是匿名函数
<script>
(function(){
console.log("我是匿名函数");
})();
</script>
1
2
3
4
5
此方法不用被调用,立即执行,并且只执行一次。
在最开始的例子中我们发现外部函数 fn 的变量定义只定义一次,闭包的核心只在返回函数,那么为了节省全局变量可以将外部函数设为 IIFE 。
闭包实现中最重要的便是讲内部函数暴露在外面,下面讲解一下用 IIFE 实现,和暴露内部函数的方法
暴露内部函数的方法一:通过return返回内部函数
var fn = (function(){
var a = 1;
function add(){
a++;
}
function print(){
console.log(a);
}
return {add,print}
})();
var add = fn.add;
var print = fn.print;
add();
print(); //2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
暴露内部函数的方法一:通过全局对象 window 将内部函数暴露出来
(function(){
var a = 1;
function add(){
a++;
}
function print(){
console.log(a);
}
window.fn={add,print}
})();
var add = fn.add;
var print = fn.print;
add();
print();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
文章最后发布于: 2019-11-16