闭包有两种情况:(1)函数作为返回值;(2)函数作为参数传递
(1)函数作为返回值
function fn(){
var num=10;
return function innerfn(num2){
console.log(num-num2);
}
}
var f=fn();
f(3);
首先,
innerfn作为返回值赋值给f变量,执行f(3)时,innerfn作用域需要用到num但是在当前上下文中找不到num,就会到创建这个函数的作用域fn去找num。
为了能够找到num,fn的执行上下文环境必须一直存在于栈中。这就是一个特殊情况了,即调用完毕后并不会销毁。
因此,使用闭包会增加内容开销
(2)函数作为参数传递
function outerfn(innerfn){
return fn;
}
var concretefn=outerfn(function(){
console.log("aa");
});
concretefn();