定义
当内部函数被保存到外部时,会生成闭包
闭包会导致原有作用域链不释放,造成内存泄漏(泄露过多,内存则变得过少)
即两个或多个函数嵌套,内部函数保存到全局时(外部函数的外部),生成闭包
如何让内部函数跑到外部,成立闭包
- return
- 操作内部函数,把内部函数赋给全局变量
<script type="text/javascript">
var demo;
function test(){
var abc=111;
function a(){
console.log(abc);
}
demo = a;
}
test();
demo();
</script>
作用
1. 实现公有变量
eg:函数累加器(不依赖于外部变量,且能反复执行)
<script type="text/javascript">
function add(){
var count = 0;
function demo(){
count++;
console.log(count);
}
return demo;
}
var counter = add();
counter();
counter();
counter();
counter();
counter();
counter();
</script>
2. 可以做缓存(存储结构)
eg:eater;
<script type="text/javascript">
function eater(){
var food = "apple";
var obj = {
eatFood:function(){
if(food != ""){
console.log("I am eating " + food);
food="";
}
else{
console.log("There is nothing!")
}
},
pushFood:function(myFood){
food = myFood;
}
}
return obj;
}
var person = eater();
person.eatFood();
person.eatFood();
person.pushFood('banana');
person.eatFood();
</script>
多个函数和一个函数形成一个闭包,变量可以共用,因为大家保存的是同一个域
3. 可以实现封装,属性私有化
eg:Person( );
4. 模块化开发,防止污染全局变量
问题
<script type="text/javascript">
function test(){
var arr = [];
for( var i = 0; i < 10; i ++){
arr[i] = function(){
document.write(i + " ");
}
}
return arr;
}
var myArr = test();
for(var j = 0; j < 10; j++){
myArr[j]();
}
</script>
立即执行函数
此类函数没有声明,在一次执行过后即释放,适合做初始化工作
特点: 定义完之后读到这儿立即执行,执行完立即销毁
两种写法:
原理相同,只是数学符号( )优先级更高
(function(){}());
//W3C建议此种写法
(function(){})();
var num = (function(a, b, c){
var d = a + b + c*2 - 2;
return d;
}(1, 2, 3))//JS中唯一一个执行完即销毁的函数
与普通函数一样,具有执行期上下文,预编译
只有表达式才能被执行,
“表达式 + 执行符号”,与立即执行函数原理一样,一旦表达式被执行,就会失去对原来函数的索引
利用立即执行函数解决上述问题
<script type="text/javascript">
function test(){
var arr = [];
for( var i = 0; i < 10; i ++){
(function(i)
{arr[i] = function(){
document.write(i + " ");
}
})(i);
}
return arr;
}
var myArr = test();
for(var j = 0; j < 10; j++){
myArr[j]();
}
</script>