最近一直处于笔试面试、笔试面试的状态,说起这段苦逼的日子还真是颠覆了自己以前对找工作的难易度的想象,不过也收获颇丰,感觉自己知识面还算可以,但是细节性的东西把握得真的是不好,好多东西在翻阅大神的博客或者资料的时候曾经看到过,也些许记得几个要点,想着自己去跑一下试试但放着放着就忘记了,所以面试的时候老是败在细节性的问题上。
言归正传,闭包算是在面试环节的宠儿,面试官总会喜欢“来,给我写个闭包”来考验一下基础知识同时为下一个问题做缓冲,闭包也算是JS中一个标志性的问题,我们今天就来说说闭包这位“爱国英雄":
首先看下面的例子:
function aa() {
var bb=1;
}
alert(bb);
在函数aa的作用域外面是访问不到bb这个变量的,怎么办,缺少这个任务道具,任务完不成啊!这时候闭包就站出来了:为了组织,我愿意潜伏!!于是就有了下面这个壮烈的景象:
function aa() {
var bb=1;
return function () {
return bb;
}
}
alert(aa()());
间谍闭包被大BOSSaa()发现,经过一阵痛打,被狠狠得扔(return)出了门外,组织的同志alert迅速跑了过去,没成想,壮士闭包已经气息奄奄,手颤颤巍巍得拿(return)出了一张纸片,头一歪,没了呼吸。alert同志拿着纸片,哭了出来,大声喊道:原来bb是1啊!我**押的是2啊!!!
通过上面那个场景,与其说闭包是可以访问父级函数活动对象的函数,不如说闭包是函数内部环境与外部环境之间的桥梁,通过闭包的付出,我们可以轻松得访问到函数内部的变量,向闭包同志致敬!
以下是几个注意的点:
1.不是所有的闭包都会被发现扔(return)出来:
function aa(){
var n =1;
a = function(){return n;}
}
aa();
alert(a());
这段代码中由于a没有使用var来声明,所以变成了全局变量,没有伤亡就取回了重要机密,当然这种方式不提倡,只是想告诉大家是不是闭包请通过上方红色的内容来判断
2.通过return返回的每一个闭包内的活动对象都是独立的:
function aa(){
var n =1;
return function(){return ++n;}
}
var a1 =aa(),
a2=aa();
console.log(a1());//2
console.log(a1());//3
console.log(a2());//2
a1、a2中的变量n是独立的,存储在各自的作用域里,互不干涉
3.由于闭包引用了父函数的活动变量,会导致这些活动对象无法被垃圾回收机制回收,依旧存在内存之中,使用时要格外注意!
---------16.11.26添加-----
4.函数在自己被定义的作用于之外的作用域被调用,正是闭包使得函数可以继续访问函数被定义时的作用域
5.其实闭包无处不在
function(message){
setTimeout(function(){ console.log('message'), 1000 });
}
就是一个很简单的闭包的例子