一.什么是闭包?
把局部变量闭包成当前作用域的私有变量的函数。(能够读取其他函数内部变量的函数)
二.特点
优点:
把局部变量拿到作用域的外部使用,让外部访问函数内部变量成为可能。
缺点:
闭包的变量会存到内存里面 , 大量使用闭包会导致内存泄漏(有一块内存空间被长期占用,而不被释放)
三.例题
例子1
function Method(){
var name="蒋丞"; //闭包变量
return function(){ //闭包函数
return name;
}
}
var fun=Method()();
console.log(fun); //蒋丞
例子2
function Method(){
var num=1;
return function(){
num+=3;
console.log(num);
}
}
var fun=Method();
fun(); //4
fun(); //7
fun(); //10
例子3
function aaa(){
var name="xxx";
return function bbb(){
alert(name);
}
}
var fun2=aaa()(); //弹出xxx
例子4 (闭包面试题)
非闭包:
var arr=[];
for(var i=0;i<10;i++){
function list(){
console.log(i);
}
arr.push(list);
}
//console.log(arr);
arr[0](); //10
arr[3](); //10
因为js执行为单线程,先将for循环执行完毕后才开始执行
(1)改为闭包,输出0~9
var arr=[];
for(var i=0;i<10;i++){
//将下面的 函数 改闭包函数
var list=(function(n){
var num=n;
return function(){ //返回一个函数
console.log(num);
}
})(i);
arr.push(list);
}
console.log(arr);
arr[0](); //0
arr[0](); //0
arr[1](); //1
arr[2](); //2
arr[3](); //3
(2)改为闭包,输出1~10
var arr=[];
for(var i=0;i<10;i++){
//将下面的 函数 改闭包函数
var list=(function(n){
var num=n;
return function(){ //返回一个函数
num++; //取消则输出0~9
console.log(num);
}
})(i);
arr.push(list);
}
console.log(arr);
arr[0](); //1
arr[0](); //2
arr[0](); //3
arr[0](); //4
arr[1](); //2
arr[2](); //3
arr[3](); //4
例子5
function my(){
var n=999;
return function my1(){
n++;
console.log(n);
}
}
/*my()(); //1000
my()(); //1000
my()(); //1000*/
var fun3=my();
fun3(); //1000
fun3(); //1001
fun3(); //1002
例子7
对象里面的属性和方法使用 对象.属性或者方法
this指针:常规的函数this指针指向的全是window, 对象里面的函数this指向是当前对象
var name="The Window";
var object={
name: "My Object",
getNameFunc:function(){
return function(){
return this.name; //this window(The Window)
}
}
}
console.log(object.getNameFunc()()); //The Window
例子8 (一个完全的闭包)
var name1= "The Windows";
var object1={
name1: "My Object",
getNameFunc:function(){
var name1=this.name1;
return function(){
return name1; //My Object
}
}
}
console.log(object1.getNameFunc()());
例子9 (一次性计时器 延迟1000ms 执行前面的回调函数)
setTimeout(执行代码,延时时间)
/*setTimeout(function (){
console.log("执行代码");
},1000);*/ //一次性 延时多少ms执行
for(var i=0;i<10;i++){
/*setTimeout(function (){
console.log(i);
},0);*/ //输出10个10 因为js属于单线程 (遇到for循环,计时器要先排成一个队列一个一个执行,开始走的时候for循环已经执行完毕,i为最大值)
for(var i=0;i<10;i++){
(function (n){
//n 就是闭包变量
setTimeout(function () {
console.log(n);
})
})(i)
} //输出0~9