js的闭包问题

首先我们需要了解闭包,了解闭包就要了解全局变量和局部变量。

在之前的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,而后将另一个值与前值相加。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值