本文已参与掘金创作者训练营第三期「高产更文」赛道,详情查看:掘力计划|创作者训练营第三期正在进行,「写」出个人影响力。
立即执行函数(自调用函数)
(function(形参){
// ...
})(实参);
这种函数将自动执行,不用等待被调用。
作用:制造出一个函数作用域,声明局部变量,防止污染全局变量。
闭包
(function(){
var a = "变量";
function fn() {
console.log(a);
}
})();
有一个局部变量 a,有一个函数 fn,fn 里面可以访问到 a 变量。
这就是一个闭包。
但我们在网上看见的常见的闭包写法是这样的(函数嵌套函数,然后 return 一个函数):
function fn() {
var a = 1;
function fn2() {
a++;
return a;
}
return fn2;
}
var fn3 = fn();
fn3();
这个写法中的 a 变量和 fn2 函数就组成了一个闭包。
总结一下就是:函数 + 环境(函数内部能访问到的变量),就是一个闭包。
为什么要函数嵌套函数呢?
是因为需要局部变量,所以才把 a 放在一个函数里,如果不把 a 放在一个函数里,a 就是一个全局变量了,达不到使用闭包的目的——隐藏变量。
所以函数套函数只是为了造出一个局部变量。
为什么要 return 呢?
因为如果不 return,你就无法使用这个闭包。把 return fn2 改成 window.fn2 = fn2 也是一样的,只要让外面可以访问到这个 fn2 函数就行了。
所以 return fn2 只是为了 fn2 能被使用。
闭包的作用
闭包常常用来间接访问一个变量,换句话说:隐藏一个变量,只暴露出一个访问器(函数)。
上面的代码中 a 就是被隐藏的变量,fn2 函数就是访问器。
内存泄漏
现代浏览器中的闭包不会造成内存泄漏。