- 浏览: 7960833 次
- 性别:
- 来自: 广州
-
文章分类
- 全部博客 (2425)
- 软件工程 (75)
- JAVA相关 (662)
- ajax/web相关 (351)
- 数据库相关/oracle (218)
- PHP (147)
- UNIX/LINUX/FREEBSD/solaris (118)
- 音乐探讨 (1)
- 闲话 (11)
- 网络安全等 (21)
- .NET (153)
- ROR和GOG (10)
- [网站分类]4.其他技术区 (181)
- 算法等 (7)
- [随笔分类]SOA (8)
- 收藏区 (71)
- 金融证券 (4)
- [网站分类]5.企业信息化 (3)
- c&c++学习 (1)
- 读书区 (11)
- 其它 (10)
- 收藏夹 (1)
- 设计模式 (1)
- FLEX (14)
- Android (98)
- 软件工程心理学系列 (4)
- HTML5 (6)
- C/C++ (0)
- 数据结构 (0)
- 书评 (3)
- python (17)
- NOSQL (10)
- MYSQL (85)
- java之各类测试 (18)
- nodejs (1)
- JAVA (1)
- neo4j (3)
- VUE (4)
- docker相关 (1)
最新评论
-
xiaobadi:
jacky~~~~~~~~~
推荐两个不错的mybatis GUI生成工具 -
masuweng:
(转)JAVA获得机器码的实现 -
albert0707:
有些扩展名为null
java 7中可以判断文件的contenttype了 -
albert0707:
非常感谢!!!!!!!!!
java 7中可以判断文件的contenttype了 -
zhangle:
https://zhuban.me竹板共享 - 高效便捷的文档 ...
一个不错的网络白板工具
http://www.cnblogs.com/onepixel/p/5062456.html
闭包,是 Javascript 比较重要的一个概念,对于初学者来讲,闭包是一个特别抽象的概念,特别是ECMA规范给的定义,如果没有实战经验,很难从定义去理解它。因此,本文不会对闭包的概念进行大篇幅描述,直接上干货,让你分分钟学会闭包!
1 闭包,一睹为快
在接触一个新技术的时候,我首先会做的一件事就是找它的 demo code。对于我们来说,看代码比自然语言更能理解一个事物的本质。其实,闭包无处不在,比如:jQuery、zepto的核心代码都包含在一个大的闭包中,所以下面我先写一个最简单最原始的闭包,以便让你在大脑里产生闭包的画面:
复制代码
复制代码
function A(){
function B(){
console.log("Hello Closure!");
}
return B;
}
var C = A();
C();//Hello Closure!
这是最简单的闭包。
有了初步认识后,我们简单分析一下它和普通函数有什么不同,上面代码翻译成自然语言如下:
(1)定义普通函数 A
(2)在 A 中定义普通函数 B
(3)在 A 中返回 B
(4)执行 A, 并把 A 的返回结果赋值给变量 C
(5)执行 C
把这5步操作总结成一句话就是:
函数A的内部函数B被函数A外的一个变量 c 引用。
把这句话再加工一下就变成了闭包的定义:
当一个内部函数被其外部函数之外的变量引用时,就形成了一个闭包。
因此,当你执行上述5步操作时,就已经定义了一个闭包!
这就是闭包。
2 闭包的用途
在了解闭包的作用之前,我们先了解一下 Javascript 中的GC机制:
在 Javascript 中,如果一个对象不再被引用,那么这个对象就会被 GC 回收,否则这个对象一直会保存在内存中。
在上述例子中,B 定义在 A 中,因此 B 依赖于 A ,而外部变量 C 又引用了 B , 所以A间接的被 C 引用。
也就是说,A 不会被 GC 回收,会一直保存在内存中。为了证明我们的推理,上面的例子稍作改进:
function A(){
var count = 0;
function B(){
count ++;
console.log(count);
}
return B;
}
var C = A();
C();// 1
C();// 2
C();// 3
count 是函数A 中的一个变量,它的值在函数B 中被改变,函数B 每执行一次,count 的值就在原来的基础上累加 1 。因此,函数A中的 count 变量会一直保存在内存中。
当我们需要在模块中定义一些变量,并希望这些变量一直保存在内存中但又不会“污染”全局的变量时,就可以用闭包来定义这个模块。
3 高端写法
上面的写法其实是最原始的写法,而在实际应用中,会将闭包和匿名函数联系在一起使用。下面就是一个闭包常用的写法:
(function(document){
var viewport;
var obj = {
init:function(id){
viewport = document.querySelector("#"+id);
},
addChild:function(child){
viewport.appendChild(child);
},
removeChild:function(child){
viewport.removeChild(child);
}
}
window.jView = obj;
})(document);
这个组件的作用是:初始化一个容器,然后可以给这个容器添加子容器,也可以移除一个容器。
功能很简单,但这里涉及到了另外一个概念:立即执行函数。 简单了解一下就行,需要重点理解的是这种写法是如何实现闭包功能的。
可以将上面的代码拆分成两部分:(function(){}) 和 () , 第1个() 是一个表达式,而这个表达式本身是一个匿名函数,所以在这个表达式后面加 () 就表示执行这个匿名函数。
因此这段代码执行执行过程可以分解如下:
var f = function(document){
var viewport;
var obj = {
init:function(id){
viewport = document.querySelector("#"+id);
},
addChild:function(child){
viewport.appendChild(child);
},
removeChild:function(child){
viewport.removeChild(child);
}
}
window.jView = obj;
};
f(document);
在这段代码中似乎看到了闭包的影子,但 f 中没有任何返回值,似乎不具备闭包的条件,注意这句代码:
window.jView = obj;
obj 是在函数 f 中定义的一个对象,这个对象中定义了一系列方法, 执行window.jView = obj 就是在 window 全局对象定义了一个变量 jView,并将这个变量指向 obj 对象,即全局变量 jView 引用了 obj . 而 obj 对象中的函数又引用了函数 f 中的变量 viewport ,因此函数 f 中的 viewport 不会被 GC 回收,viewport 会一直保存到内存中,所以这种写法满足了闭包的条件。
闭包,是 Javascript 比较重要的一个概念,对于初学者来讲,闭包是一个特别抽象的概念,特别是ECMA规范给的定义,如果没有实战经验,很难从定义去理解它。因此,本文不会对闭包的概念进行大篇幅描述,直接上干货,让你分分钟学会闭包!
1 闭包,一睹为快
在接触一个新技术的时候,我首先会做的一件事就是找它的 demo code。对于我们来说,看代码比自然语言更能理解一个事物的本质。其实,闭包无处不在,比如:jQuery、zepto的核心代码都包含在一个大的闭包中,所以下面我先写一个最简单最原始的闭包,以便让你在大脑里产生闭包的画面:
复制代码
复制代码
function A(){
function B(){
console.log("Hello Closure!");
}
return B;
}
var C = A();
C();//Hello Closure!
这是最简单的闭包。
有了初步认识后,我们简单分析一下它和普通函数有什么不同,上面代码翻译成自然语言如下:
(1)定义普通函数 A
(2)在 A 中定义普通函数 B
(3)在 A 中返回 B
(4)执行 A, 并把 A 的返回结果赋值给变量 C
(5)执行 C
把这5步操作总结成一句话就是:
函数A的内部函数B被函数A外的一个变量 c 引用。
把这句话再加工一下就变成了闭包的定义:
当一个内部函数被其外部函数之外的变量引用时,就形成了一个闭包。
因此,当你执行上述5步操作时,就已经定义了一个闭包!
这就是闭包。
2 闭包的用途
在了解闭包的作用之前,我们先了解一下 Javascript 中的GC机制:
在 Javascript 中,如果一个对象不再被引用,那么这个对象就会被 GC 回收,否则这个对象一直会保存在内存中。
在上述例子中,B 定义在 A 中,因此 B 依赖于 A ,而外部变量 C 又引用了 B , 所以A间接的被 C 引用。
也就是说,A 不会被 GC 回收,会一直保存在内存中。为了证明我们的推理,上面的例子稍作改进:
function A(){
var count = 0;
function B(){
count ++;
console.log(count);
}
return B;
}
var C = A();
C();// 1
C();// 2
C();// 3
count 是函数A 中的一个变量,它的值在函数B 中被改变,函数B 每执行一次,count 的值就在原来的基础上累加 1 。因此,函数A中的 count 变量会一直保存在内存中。
当我们需要在模块中定义一些变量,并希望这些变量一直保存在内存中但又不会“污染”全局的变量时,就可以用闭包来定义这个模块。
3 高端写法
上面的写法其实是最原始的写法,而在实际应用中,会将闭包和匿名函数联系在一起使用。下面就是一个闭包常用的写法:
(function(document){
var viewport;
var obj = {
init:function(id){
viewport = document.querySelector("#"+id);
},
addChild:function(child){
viewport.appendChild(child);
},
removeChild:function(child){
viewport.removeChild(child);
}
}
window.jView = obj;
})(document);
这个组件的作用是:初始化一个容器,然后可以给这个容器添加子容器,也可以移除一个容器。
功能很简单,但这里涉及到了另外一个概念:立即执行函数。 简单了解一下就行,需要重点理解的是这种写法是如何实现闭包功能的。
可以将上面的代码拆分成两部分:(function(){}) 和 () , 第1个() 是一个表达式,而这个表达式本身是一个匿名函数,所以在这个表达式后面加 () 就表示执行这个匿名函数。
因此这段代码执行执行过程可以分解如下:
var f = function(document){
var viewport;
var obj = {
init:function(id){
viewport = document.querySelector("#"+id);
},
addChild:function(child){
viewport.appendChild(child);
},
removeChild:function(child){
viewport.removeChild(child);
}
}
window.jView = obj;
};
f(document);
在这段代码中似乎看到了闭包的影子,但 f 中没有任何返回值,似乎不具备闭包的条件,注意这句代码:
window.jView = obj;
obj 是在函数 f 中定义的一个对象,这个对象中定义了一系列方法, 执行window.jView = obj 就是在 window 全局对象定义了一个变量 jView,并将这个变量指向 obj 对象,即全局变量 jView 引用了 obj . 而 obj 对象中的函数又引用了函数 f 中的变量 viewport ,因此函数 f 中的 viewport 不会被 GC 回收,viewport 会一直保存到内存中,所以这种写法满足了闭包的条件。
发表评论
-
微信开发工具中时间问题的小坑
2018-02-07 19:07 840刚开始用微信小程序开发工具,每次运行任何应用,都报这个错误: ... -
三篇不错的介绍CSS GRID的文章
2017-12-06 09:08 565三篇不错的介绍CSS GRID的文章: http://www. ... -
双因素认证(2FA)教程
2017-11-03 09:16 1578http://www.ruanyifeng.com/blog/ ... -
es6 中的export
2017-08-20 08:00 834https://juejin.im/post/5998625f ... -
markdown中的空格
2017-08-20 07:53 1709即使手动输入空格, 也是很不推荐的方法。我推荐全角空格,切换 ... -
(转)讲真,别再使用JWT了
2017-08-17 23:21 1021不错的好文: http://insights.thoughtw ... -
(转)手把手教你WebStorm+chrome实现时时调试刷新
2017-08-15 10:50 3043参考: http://jingyan.baidu.com/ar ... -
IntelliJ Idea 2017 免费激活方法
2017-08-15 09:38 93581. 到网站 http://idea.lanyus.com/ ... -
前端框架这么多,该何去何从?
2017-08-04 07:17 653http://insights.thoughtworkers. ... -
记录一个HTML 5画拓扑图的商业公司
2017-07-18 19:56 854http://qunee.com/ DEMO:http:// ... -
vue 2例子学习收集
2017-07-16 11:46 10161 vue2.0手撸闲鱼App https://githu ... -
(收藏)虚拟DOM内部是如何工作的
2017-07-13 22:08 604虚拟DOM内部是如何工作的 https://segmentfa ... -
最近看到的几篇精彩JAVASCRIPT博客文章推荐
2017-07-11 07:10 580【深度长文】JavaScript数组所有API全解密 http ... -
jsonp 跨域原理:深入浅出 jsonp
2017-07-10 19:55 1439https://lzw.me/a/jsonp.html jso ... -
(转)深度长文-JavaScript数组所有API全解密
2017-07-08 19:59 830深度长文-JavaScript数组所有API全解密 http: ... -
(收藏)网页导出PDF的方案
2017-07-06 07:13 1007(收藏)网页导出PDF的方案 https://yiqiwuli ... -
Chromium 新的弹窗机制以及 HTML 的 <dialog> 元素
2017-06-28 12:37 1157https://juejin.im/post/59525195 ... -
国内一个不错的大屏UI设计厂家
2017-06-03 19:43 3164http://www.lanlanwork.com/dp.ph ... -
canvas仿芝麻信用分仪表盘
2017-05-28 20:21 1608canvas仿芝麻信用分仪表盘 https://segment ... -
(转)CSS 变量教程
2017-05-10 21:12 587http://www.ruanyifeng.com/blog/ ...
相关推荐
因此,本文不会对闭包的概念进行大篇幅描述,直接上干货,让你分分钟学会闭包! 1、闭包–爱的初体验 在接触一个新技术的时候,我首先会做的一件事就是:找它的demo code。对于码农们来说,代码有时候比自然语言更能...
因此,本文不会对闭包的概念进行大篇幅描述,直接上干货,让你分分钟学会闭包! 1 闭包,一睹为快 在接触一个新技术的时候,我首先会做的一件事就是找它的 demo code。对于我们来说,看代码比自然语言更能理解一个...
本"JavaScript视频教程"共包含7节,每节深入浅出地讲解了JavaScript的基础与进阶知识,总计时长超过90分钟,为学习者提供了全面且详尽的学习资源。 1. **基础语法**:JavaScript的基础语法包括变量声明(var、let、...
在“coderetreat_js:我们在代码撤退中所做的工作”这个项目中,主要涉及的是JavaScript编程语言以及在软件开发中的代码撤退(Code Retreat)实践。代码撤退是一种特殊的编程活动,旨在提升开发者的设计技能、熟悉...
人力资源+大数据+薪酬报告+涨薪调薪,在学习、工作生活中,越来越多的事务都会使用到报告,通常情况下,报告的内容含量大、篇幅较长。那么什么样的薪酬报告才是有效的呢?以下是小编精心整理的调薪申请报告,欢迎大家分享。相信老板看到这样的报告,一定会考虑涨薪的哦。
迅雷
21考试真题最近的t210.txt
内容概要:本文介绍了一个基于Java的简单命令行学生管理系统。该项目包含了添加、查看、更新和删除学生的全部功能,并对每个部分的实现进行了详尽展示,包括关键源代码以及操作步骤指引。项目的主干由多个重要文件构成:Student.java 负责定义学生类及其属性访问器方法;StudentManager.java 实现对学生信息的操作处理逻辑,如创建、读取、更新、销毁(CRUD)等;而 Main.java 则用于执行主程序逻辑并初始化StudentManager实例,提供命令行交互环境以供用户执行相应操作。
one-api本地部署ollama+deepseek-r1
krpanodew,全景编辑器。一键生成全景图和连续前景图并生成场景。
基于Matlab 2021的两电平拓扑三相桥式逆变并网仿真:双环PI控制、SPWM调制与LCL滤波研究,基于Matlab2021的电压型三相桥式逆变并网仿真研究:双环PI控制、SPWM调制与LCL滤波器的应用,电压型三相桥式逆变并网仿真Matlab2021 电路采用两电平拓扑,采用双环PI控制, 变部分加设PLL锁相环, 采用SPWM调制,逆变器输出端加设LCL滤波器,并入电网。 可以得到逆变器输出端为三电平的线电压波形,滤波后可以得到对称三相电压、电流波形。 无需发,联系即可发邮件。 ,三相桥式逆变器;两电平拓扑;双环PI控制;电压型逆变;PLL锁相环;SPWM调制;LCL滤波器;电网并网;线电压波形。,Matlab 2021三相桥式逆变并网仿真:双环PI控制与LCL滤波器应用
纯电动汽车零部件建模机理与前后向仿真控制策略详解:聚焦BMS、再生制动及电机驱动扭矩策略,纯电动汽车零部件建模机理与前后向仿真控制策略详解:从Cruise到ADVISOR建模实践与能量流解析,纯电动汽车各零部件建模机理及BMS、再生制动和电机驱动扭矩策略,逻辑清晰公式明晰。 主要从前向和后向仿真两大类分别阐述建模机理和控制策略。 前向模型主要参考Cruise建模及相关文献,后向模型主要参考ADVISOR建模且对其自带的纯电动汽车模型进行注释分析。 现打包,包含文档、参考模型和参考文献等,适合学习纯电动汽车建模机理,整篇文档主要为公式和整车能量流走向 ,关键零部件建模; BMS; 再生制动; 电机驱动扭矩策略; 前向仿真建模; 后向仿真建模; 能量流走向; 公式明晰; 文档参考。,纯电动整车建模与控制策略解析:BMS、再生制动与电机驱动扭矩的深度研究
情人节html+css源码
基于Yolo系列算法的计算机视觉与人工智能目标检测技术研究,基于Yolo系列算法的计算机视觉与人工智能目标检测技术分析,基于yolo系列的目标检测分析,人工智能,计算机视觉。 ,基于yolo系列;目标检测分析;人工智能;计算机视觉,基于Yolo系列的人工智能计算机视觉目标检测分析
项目工程资源经过严格测试运行并且功能上ok,可实现复现复刻,拿到资料包后可实现复现出一样的项目,本人系统开发经验充足(全栈全领域),有任何使用问题欢迎随时与我联系,我会抽时间努力为您解惑,提供帮助 【资源内容】:包含源码+工程文件+说明等。答辩评审平均分达到96分,放心下载使用!可实现复现;设计报告也可借鉴此项目;该资源内项目代码都经过测试运行,功能ok 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 【提供帮助】:有任何使用上的问题欢迎随时与我联系,抽时间努力解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 下载后请首先打开说明文件(如有);整理时不同项目所包含资源内容不同;项目工程可实现复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用,资源为网络商品(电子资料类)基于网络商品和电子资料商品的性质和特征不支持退款,质量优质,放心下载使用
Epson_L130,需要删除后缀
21考试真题最近的t315.txt
22考试真题最近的t3.txt
双重搜索算法BAS-SCA融合正余弦算法优化极限学习机ELM:混合改进机制,避免局部最优,提高收敛精度,双重搜索算法BAS-SCA与正余弦算法融合优化极限学习机ELM:避免局部最优的混合改进机制,提高收敛精度,融合天牛须算法与正余弦算法的双重搜索算法BAS-SCA优化极限学习机ELM,采用混合改进机制可有效避免搜索陷入局部最优,收敛精度高 ,关键词:融合算法;双重搜索;BAS-SCA;优化;极限学习机ELM;混合改进机制;局部最优;收敛精度高。,双算法融合优化ELM,高效避免局部最优,提高收敛精度
基于NPC五电平逆变器的并网逆变器PQ控制技术研究——通过功率闭环控制实现精确电网相位锁相环与高效并网功率因数调整,基于双二阶广义积分器的NPC五电平逆变器并网PQ控制技术:功率闭环控制与离散化仿真实现,NPC五电平逆变器。 并网逆变器PQ控制。 通过功率闭环控制,实现并网单位功率因数,即并网电流与网侧电压同相位。 为了得到电网电网相位,采用基于双二阶广义积分器的锁相环,该锁相环可以快速准确无误的得到电网相位。 且在初始阶段,就可以得到电网相位,比Matlab自带的锁相环要快很多。 并网有功设定为50kW,无功设定为0,通过仿真可以看出,很快实现了给定的并网功率。 整个仿真全部离散化,包括采样与控制的离散,控制与采样环节没有使用simulink自带的模块搭建,全部手工搭建。 ,基于上述信息,以下是几个核心关键词: NPC五电平逆变器; 并网逆变器PQ控制; 功率闭环控制; 电网相位; 快速准确锁相环; 离散化仿真; 手工搭建。,离散化控制的五电平逆变器并网策略研究