JavaScript的闭包

JavaScript的闭包

说到闭包,我们首先要了解到变量的作用域,接下来我来举个例子:

var num = 10;
function f1(){
    console.log(num);
    var num1 = 20;
    console.log(num1);
}
f1();
console.log(num1);

执行以上的代码,会发现从上到下的 结果为10 , 20,undefined,这是为什么呢?主要还是作用域在捣乱。

一个变量的作用域取决他所在的位置,如果他属于全局变量的话,则是在任何地方都可以调用,而如果是局部变量,则有一定的限制,一般就是在他所在的方法之中。

了解了变量的作用域,接下来就来谈谈闭包。闭包主要分为函数闭包和对象闭包。

1、何为函数闭包

function open() {
    var num = 10;
    function close() {
        console.log(num);
    }
    close();
}
open();

​ 上面的代码便是函数闭包,在上面可以看到的是一个函数里面嵌套这另一个函数,这有点类似于java中的类中类(类里面嵌套类)。如果执行一下上面的代码可以看到 控制台上的结果是10。至于为什么,作用域嘛!

2、何为对象闭包

function fun5() {
    var num = 10;
    var obj = {
        age: num
    };
    console.log(obj.age);
}
fun5();

​ 上面的代码便是函数闭包,在上面可以看到的是一个函数里面创建一个对象,在这个对象里面使用对象外的数据。如果执行一下上面的代码可以看到 控制台上的结果是10。至于为什么,跟上面一样,变量的作用域!

3、闭包有什么用

总结:如果想缓存数据就是用闭包
作用:就是缓存数据—->既是优点也是缺点,缺点—->不能及时的释放
未使用闭包前,每一次调用完,里面的变量就会被释放,然后再在调用在释放
使用闭包后,就是延长局部变量作用域的时间,不能及时释放

4、来个小案例

ul {list-style-type: none;}

li {float: left; margin-left: 10px;}

img {width: 200px; height: 180px;}

input {margin-left: 30%;}
<ul>
    <li><img src="img/1.jpg" alt=""><br/><input type="button" value="赞(1)"></li>
    <li><img src="img/2.jpg" alt=""><br/><input type="button" value="赞(1)"></li>
    <li><img src="img/3.jpg" alt=""><br/><input type="button" value="赞(1)"></li>
    <li><img src="img/4.jpg" alt=""><br/><input type="button" value="赞(1)"></li>
</ul>
let btns = document.getElementsByTagName("input");
function value() {
    let value = 1;
    return function () {
        this.value = "赞(" + (++value) + ")";
    }
}
for (let i = 0; i < btns.length; i++) {
    btns[i].onclick = value();
}

这样点击每一个按钮不会影响其他的按钮。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值