function fn(i) {
console.log(i)
return function () {
i = i + 12
console.log(i)
}
}
alert(fn(11))
fn(11)()//在调用函数后面加一个(),再次调用一下调用函数
return只是返回一个函数,并未执行,要再次调用才能执行return的函数
闭包函数案例
function fn(){
var arr = [];
for(var i = 0;i < 5;i ++){
arr[i] = function(){
return i;
}
}
return arr;
}
var list = fn();
for(var i = 0,len = list.length;i < len ; i ++){
console.log(list[i]());
} //5 5 5 5 5
执行过程:var list = fn();
,fn()中for循环依次生成五个函数并加入数组,执行结束,此时,闭包函数外界环境 i=5
。
全局中for循环开始执行console.log(list[i]());
,开始执行list[i]()
,返回闭包函数执行return i;
,闭包函数的外部函数环境i=5,
闭包函数中的i取值按照优先级顺序,先局部
,后全局。经过五次循环,依次输出5.
function fn(){
var arr = [];
for(var i = 0;i < 5;i ++){
arr[i] = (function(i){
return function (){
return i;
};
})(i);
}
return arr;
}
var list = fn();
for(var i = 0,len = list.length;i < len ; i ++){
console.log(list[i]());
} //0 1 2 3 4
执行过程:与上对比,在执行var list = fn();
时,执行函数内的循环生成(function(i){ return function (){ return i; }; })(i);
,同时闭包环境i的值依次为0,1,2,3,4,依次加入数组arr。
执行全局的循环,执行 console.log(list[i]()
,先执行list[i],返回(function(i){ return function (){ return i; }; })(i);
,然后执行list[i]()
,function (){ return i; }();
,此时的闭包环境的i随循环的arr的下标进行改变。遵循变量取值的优先级原则,return的i值也随之改变,并在控制台打印出来。