首先我们需要了解闭包,了解闭包就要了解全局变量和局部变量。
在之前的js相关博客中,已经提到过全局变量和局部变量。全局变量是在整个js的作用范围,还要了解在定义全局变量时,它前面的关键字是可以省略的。而局部变量作用范围只是在当前的作用域。
我们在调用局部变量时要使用到return语句,由此引出我们的闭包问题。
闭包可简单理解为使用别的局部变量。其缺点是闭包的值会存在内存里,大量使用闭包会导致内存泄露。
我们通常在做js的版本库的封装的时候会经常使用到闭包。
下面我们通过代码来进一步了解闭包。
function f1(){
var num=10;
function f2(){
console.log(num);
}
return f2();
}
f1();
//在这个方法里,num的值相对于f2来说时一个全局变量,该值可以被f2调用
在这个方法中,num的值是局部变量,但它和f2方法时同级关系,所以相对于f2来说,num对它是一个全局变量。
showname();
function showname(){
var num=10;
return num;
}
showstu();
function showstu(){
console.log(showname());
}
num的值属于shouname方法,若无return语句,showstu方法不能显示num的值,这里return就是闭包,让showstu方法调用showname方法的局部变量。
function f1(){
var x=100;
return x;
}
f1();
function f2(){
console.log(f1());
}
f2()
这段代码和上面一段代码含义相同,使用闭包让f2方法调用f1方法的局部变量。
下面的代码是一段关于闭包的题目:
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, 3));//5
console.log(sum(2)(3));//5
两个输出的结果虽然相同,但是所走的语句是不同的。第一个走的语句是长度不为1,两个参数相加;第二个走的语句是长度为1,而后将另一个值与前值相加。