闭包,一个浪漫的故事

闭包,一个浪漫的故事

今天稍微说一下js中的闭包,这是个新手很少遇到的老手不常遇到的问题,他的出现主要是为了帮我们规避问题,另外提供了一种解决问题的新途径,这里先说明一点啊,虽然最近写的文章理论性比较强很少有代码,但是以后肯定会贴一部分代码的,今天被一个兄弟吐槽了,劈头盖脸一顿骂,说我两年之前写的博客里面代码有问题,考下去不能跑浪费人家时间什么的,这里声明一下,本人发的一切博客都是介于实践基础上的,代码是可运行的,理论当时也是正确的,可能因为随着时间的推进一些api不用了,一些理论废弃了甚至出现了兼容问题,所以大家解决问题的时候尽量找离自己时间比较近的以后的代码我会尽量上传上来,但是博文里我只粘贴部分关键代码,尽量把理论说明白,本人是不欢迎键盘侠的,就那种键盘在手,复制粘贴刷刷写代码,那样也许会完成当前的要求,但是你的代码都没读懂有变化没办法修改不说,万一别人给你植入一个后门你都不知道,好了言归正传

闭包的概念

在之前的学习之中我们都知道,js之中的作用域有两种:局部和全局,这里面需要注意的一个是预加载(上一篇,js说古道今已经提及)另一个就是闭包,不考虑作用域外提(不用var声明的函数内的变量也是全局的,不推荐这种写法),函数内的变量只在函数内起效果,像烟花易冷,转瞬即逝。那么把函数中的私有变量拿出来给其他人使用,或者拿出来变成全局变量的方法,就是闭包。

详解

function f1(){
    var n=999;
    nAdd=function(){
     n+=1
    };
    function f2(){
      alert(n);
    }
    return f2;
  }
var result1=f1();
result1(); // 999
nAdd();
result1(); // 1000

如上,我们把n拿了出来,可以在外边控制n了,当然这里的nAdd是为了能在外边调用才这么写的,平时不赞成这种写法,好奇的同学可以用浏览器的调试功能来查看变量,如果需要的话,也许在以后的某一天会单独讲一下浏览器的基本使用

为什么说闭包浪漫呢?你看啊,函数f1把自己最重要的东西都交给了f2,而f2却把它的使用权交给了别人以至于大家都可以用了,哇,很虐心有木有=v=,爱的毫无防备却被伤的痛彻心扉

function f1(){
    var n=999;
    nAdd=function(){
     n+=1
    };
    function f2(){
      alert(n);
    }
    return f2;
  }
var result1=f1();
var result2=f1();
result1(); // 999
result2(); // 999
nAdd();
result1(); // 999
result2(); // 1000

那么看完以上的你是否明白了呢?看一下这个吧~能不能想到结果是什么呢?

呢?

呢?

呢?

哈,猜不透吧,个人认为这里的原因是这样的:说白了,这里面有两个n,却只有一个nAdd,当我们第一次运行,n变成了全局变量,我们叫他n1,并且它的控制权交给了result1,这个时候nAdd就可以写成n1+=1;后来又运行了一次,上一个全局变量的n1和f1里面的局部变量n肯定井水不犯河水了啊,所以这里面的n我们就叫他n2吧,此时又重新给nAdd赋值了一次(由于他本来就是全局的所以是重新赋值而不是新增)所以我们的nAdd就变成了n2+=1;现在大家知道原因了吧~

如果在我说之前你就看明白了,说明你筋骨惊奇啊,是块练武的材料=v=

多了不说,回归本文,技术是技术,工作是工作,希望大家能更注重技术本身,加强自己对语言的理解能力而不是一味地做个键盘侠,此路长矣,我们一起努力!

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值