在js中,有时我们需要调用一个函数的局部变量,此时就会产生闭包。闭包就是能够读取其他函数内部变量的函数。由于在Javascript语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成"定义在一个函数内部的函数"。所以,在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。
但使用闭包时要注意,闭包的值 ,会存在内存里面,大量使用闭包会导致内存的泄露,所以,一般不使用闭包,在做js版本库的封装的时候会用到。
下面来展现一下闭包的基本样式:
f1();
function f1(){
n = 999;
function f2(){
console.log(n); //999
}
}
下面来列举几个典型的闭包练习题:
var sum = function () {
var cache;
if (arguments.length === 1) {
cache = arguments[0];
//如果arguments对象的长度为1,也就是参数只有1个时,将这个参数赋值给cache,暂存
return function (number) {
//返回一个函数,函数里的参数(也就是第二个括号里的参数)与之前第一个括号里的参数相加
return cache + number
}
}
else {
return arguments[0] + arguments[1]
//如果arguments对象的长度不为1,那么两个参数相加
}
}
console.log(sum(2, 53)); //5
console.log(sum(2)(3)); //5
注:arguments 是当前函数的参数列表 类似于数组的集合 使用索引值来取
上题分解思路来写:
var f1=function (){
var a;
console.log(arguments.length);//函数参数列表的长度
if(arguments.length===1)//参数列表的长度为1 进if
{
a=arguments[0];
function f2(number){
return a+number;
}
return f2;
}
else{
var b=arguments[0]+arguments[1];
return b;
}
}
f1(2,3);
// f1(2)(3)== f2; f1(2)(3)