闭包,一个浪漫的故事
闭包,一个浪漫的故事
前
今天稍微说一下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=
结
多了不说,回归本文,技术是技术,工作是工作,希望大家能更注重技术本身,加强自己对语言的理解能力而不是一味地做个键盘侠,此路长矣,我们一起努力!
闭包,一个浪漫的故事相关推荐
- java浪漫代码_Elasticsearch,从一个浪漫的故事开始(原理篇)
微信公众号:王了个博 专注于大数据技术,人工智能和编程语言个人既可码代码也可以码文字.欢迎转发与关注 从一个浪漫的故事开始 许多年前,一个名叫Shay Banon的开发者,带着新婚妻子去伦敦生活,在得 ...
- 一个浪漫又悲情的爱情故事——笛卡尔心形线
说明 写这篇文章是因为某天看到这样一个公式 r=a(1-cosθ) ,我上网搜了下,原来是笛卡尔心形线的极坐标方程,这个方程里面的确有一个浪漫又悲情的爱情故事,感兴趣的朋友可以点这里看看,而至于这个故 ...
- python turtle笛卡尔心形线_一个浪漫又悲情的爱情故事——笛卡尔心形线
说明 写这篇文章是因为某天看到这样一个公式 r=a(1-cosθ) ,我上网搜了下,原来是笛卡尔心形线的极坐标方程,这个方程里面的确有一个浪漫又悲情的爱情故事,感兴趣的朋友可以点这里看看,而至于这个故 ...
- 用门面模式讲一个浪漫的爱情故事,实现一场美好的婚礼
设计模式笔记--门面模式 门面设计模式 基本介绍 门面设计模式是一种结构型模式,通俗的来说(个人观点):门面(Facade)指的是建筑物的表面,尤其指的是最有吸引力的那一面,可以表示一种容易让人误解某 ...
- 无需训练RNN或生成模型,我写了一个AI来讲故事
作者 | Andre Ye 译者 | 弯月 出品 | AI科技大本营(ID:rgznai100) 这段日子里,我们都被隔离了,就特别想听故事.然而,我们并非对所有故事都感兴趣,有些人喜欢浪漫的故事,他 ...
- 一个叫花子的故事(十个人看完十个人开悟)
一个叫花子的故事(十个人看完十个人开悟) 从前有一个叫花子,每天出门乞讨,他很想过正常人的生活,于是他把乞讨粮食积攒起来.可是他积攒了好多年,他的粮仓还是只有一点米. 一天夜里,他悄悄地躲在角落,果然 ...
- 制作一个浪漫温馨的生日礼物送她~html+css+javascript蓝色梦幻海洋3D相册(含音乐)
❉ 制作一个浪漫温馨的生日礼物送她~html+css+javascript蓝色梦幻海洋3D相册(含音乐) 一年一度的/520情人节/七夕情人节/生日礼物/告白师妹/程序员表白,是不是要给女朋友或者正在 ...
- 转载 :高中时候想的一个脑洞大开的故事
作者:崔泽九段fans 来源:CSDN 原文:https://blog.csdn.net/tagong7920/article/details/84662152 高中时候想的一个脑洞大开的故事 故 ...
- 制作一个浪漫的表白网页
阿里云大学免费课程:[云计算的1024种玩法]制作一个浪漫的表白网页 喜欢TA,就让网页替你说出来吧! 通过该课程,1小时内学会在云服务器上制作一个简单浪漫的表白网页. 课程包括视频课程和教学文档简单 ...
最新文章
- WOJ 1313 - K尾相等数
- RabbitMQ之RPC实现
- 若要加载模块二进制_春哥说 | 浅谈NodeJs的模块机制-2
- 阿里基础设施技术亮相SIGCOMM 2018
- java eclipse 注释模板_Eclipse Java注释模板设置详解
- clamav Java_ClamAV安装使用及API例子
- Elasticsearch 7.x 安装及配置
- 睡觉时钱被转走、开房信息被叫卖、数字货币被篡改,你的安全感,还在吗?...
- 虚拟机下安装ubuntu后root密码设置
- R7-1 What is a computer? (5 分)
- 2019.8.13节点的选取
- SqlServer中 SET DATEFIRST
- UINavigationItem 设置UIBarButtonItem
- 移动Web开发字体格式选择(附.woff\.woff2 兼容性)
- SQL按每5分钟或者10分钟分组统计数据
- 茶文化网页代码(详细解释)
- 基于点线特征的激光雷达+单目视觉里程计
- AndroidStudio多渠道打包
- 【pandas之数据清洗和处理和空值处理】
- 上海滩上,共创行业新价值的大时代要来了