立即执行函数
针对初始化功能的函数
此类函数没有声明,执行完之后立即被销毁
定义一个只执行一个的函数,这个函数会一直存在内存空间中,很占用内存,所以对于只执行一次的函数,把它定义为立即执行函数更合理(某些情况除外)
只有表达式才能被执行
(function(a,b,c){
console.log(a + b + c*2);
}(1,2,3))
//立即执行函数可以有返回值
let num = (function(a,b,c){
let d = a + b + c;
return d;
}(1,2,3))
闭包
当内部函数被保存到外部时,将会生成闭包,闭包会导致原有作用域链不释放,造成内存泄漏
- 实现公有变量(函数累加器)
function add(){
var num = 0;
function a(){
console.log(++num);
}
return a;
}
var myAdd = add();
myAdd();
myAdd();
- 可以做缓存 (存储结构)
function eater(){
let food ="";
let obj = {
eat : function (){
console.log("i am eating" + food);
foot = "";
},
push : function(myfood){
food = myfood;
}
}
return obj;
}
let eater1 = eater();
eater1.push('ok');
eater1.eat();
- 可以实现封装
继承
- 模块化开发,反之污染全局变量
命名空间
容易犯的错误
function text(){
var arr = [];
for(var i = 0;i<10;i++){
arr[i] = function(){
console.log(i);
}
}
return arr;
}
var aaa = text();
for(var j = 0;j<10 ;j++){
// mss[j]();
aaa[j]();
}
- 此题返回的10个10 而不是0123456789
因为在arr数组被保存到了外部,但是在它执行之前i 已经变成10 了
function text(){
var arr = [];
for(var i = 0;i<10;i++){
(function(a){
arr[a] =function(){
console.log(a);
}
}(i))
}
return arr;
}
var aaa = text();
for(var j = 0;j<10 ;j++){
// mss[j]();
aaa[j]();
}
- 还是这题,如果想要返回的结果是你想要的,可以通过立即执行函数来解决闭包问题