优点:缓存数据,延长作用域链
缺点:由于缓存,数据不能被及时释放出来,占用内存空间
function f1 (){
var numb = 1;
console.log(numb);
return ()=>{
numb++;
return numb;
}
}
var rs=f1();//1 返回函数但是没有执行return回来的函数
console.log(rs());//2 从这里开始没执行var numb = 1;只执行return回来的函数
console.log(rs());//3
console.log(rs());//4
一般函数在调用完毕以后,在函数内部定义的变量就被内存回收释放,通过闭包的方式使得变量可以在调用完毕以后依然保存着变量
如果不好理解还有看下面这段代码
function f1 (){
var numb = 1;
console.log(numb);
return ()=>{
numb++;
console.log(numb)
}
}
f1()();//1 2 //第一个括号相当于先执行外面的f1 第二个括号再执行return回来的函数
f1()();//1 2 //重复 所以 数据不会缓存 numb始终被重置
f1()();//1 2
var rs=f1();//1 相当于把return回来的函数给了rs 但没执行return回来的函数
rs();//2 后面的就只执行return回来的函数
rs();//3
rs();//4
两者的差别就在于后者把return回来的函数赋值给rs以后,之后再执行就只执行return回来的函数。
误区: var rs = f1()意思是先把f1执行一次然后把返回值赋值给rs 而不是把整个函数给rs变量 之前一直以为 rs()执行的是整个f1函数
比如下面这段代码:
function f (){
console.log('nihao');
return 15
}
var a = f();//这么写都是让变量来接受返回值的 如果函数没返回值也会执行
a();//报错 以前我自己以为相当于把f函数整个给了a
//真正的赋值函数是这样的:
var b = function f2 (){...}
在函数外部如何调用函数内部的函数?
function f1(){
var n=999;
nAdd=function(){n+=1}
function f2(){
alert(n);
}
return f2;
}
var result=f1(); //要先运行一次定义nAdd()才能执行nAdd()
result(); // 999
nAdd();
result(); // 1000
只要在函数里又有一个函数 那么就会缓存数据
function f1(){
var n=999;
nAdd=function(){
n+=1;console.log(n);
}
console.log(n)
}
var result=f1(); //999
nAdd();// 1000
nAdd();// 1001
nAdd();// 1002
nAdd();// 1003