第二话:javascript中闭包的理解
闭包是什么?
通过闭包,子函数得以访问父函数的上下文环境,即使父函数已经结束执行。
OK,我来简单叙述下,先上图。

都知道函数是javascript整个世界,对象是函数,方法是函数,并且js中实质性的面向对象相关也都是函数来实现和延伸,例如:“类”。
window:是指js中window对象,也是js最高一层,因为什么这么说,因为你所有创建的方法和属性其实都在window之内。window中的所有方法,在手动创建的方法中都可以调到。可以仔细想想alert,在任何地方都可以alert,其实alert就是window内部的一个方法。window.alert()。具体参看:JavaScript Window - 浏览器对象模型
回到图上:
那么我创建的每一个全局function其实都是window的方法,所以window把a()和b()包含;但d()和e()呢?他们是局部的。a()包含d(),b()包含e();由此推出下面代码:
function window(){ //虚构出来的,只为说明问题,因为window属于浏览器内置类,所以根本看不到
function a(){
var a = 1;
function d(){
var d = 3;
alert(a+d); //4
}
}
function b(){
var b = 1;
function e(){
var e = 4;
alert(b+e);
}
}
}
其实闭包的概念已经包含在这个函数中,d()中可以访问a()中定义的a变量和window中声明的所有变量和函数,e()中可以访问b()中的b变量和window中声明的所有变量和函数。
完毕。
闭包中最常见的用途是声明事件处理器和匿名空间使用:
声明事件处理器
function a(){
var obj = document.getElementById("text");
obj.onclick = function(){ obj.innerHTML = " hello world!"};
}
绑定到onclick上的函数建立了一个闭包,所以它能访问obj变量。
function a(){
var obj = document.getElementById("text");
obj.onclick = clickHandler;
}
function clickHandler(){
function(){ obj.innerHTML = " hello world!"};
}
clickHandler并不能访问到obj,因为clickHandler定义在a()外部。
闭包引用可以避免this调用造成的恐慌。
function launcher(element,message){
function openWin(){
alert(message);
}
window.addEventListener("click",element,false);
}
launcher("document.getElementById("text")","hello world!");
匿名空间:
在js组件开发之中,如果涉及到无穷多的组件加载,那命名冲突不可避免。
例如:
//组件1
var abc = 5;
function TabView(cfg){
this.a = cfg.a;
this.b = cfg.b;
}
TabView.protype = {
c:function(){ abc++;};
d:function(){abc--};
}
//组件2
var abc = 100;
function TreeView(cfg){
this.a = cfg.a;
this.b = cfg.b;
}
TreeView.protype = {
c:function(){ abc*=2;};
d:function(){abc/=2;};
}
如果一个项目同时需要加载这两个组件,那么就会出现命名冲突;因此我们需要来避免这种问题,通过采用匿名空间-----闭包的办法;
//组件1
(function (){
var abc = 5;
function TabView(cfg){
this.a = cfg.a;
this.b = cfg.b;
}
TabView.protype = {
c:function(){ abc++;};
d:function(){abc--};
}
window.TabView = TabView; //将TabView类公开(作用域在window下)。除该类以外所有匿名空间内部定义,都对外界不形成干扰;
})();
//组件2
(function (){
var abc = 100;
function TreeView(cfg){
this.a = cfg.a;
this.b = cfg.b;
}
TreeView.protype = {
c:function(){ abc*=2;};
d:function(){abc/=2;};
}
window.TreeView = TreeView; //将TabView类公开(作用域在window下)。除该类以外所有匿名空间内部定义,都对外界不形成干扰;
})()
外部调用的时候只需:
var tabView = new TabView();
var treeView = new TreeView();
ok,细细回味,闭包会带来很多方便……
第二话:javascript中闭包的理解的更多相关文章
- 关于javascript中闭包的理解
闭包就是能够读取其他函数内部变量的函数. 在javascript中,只有函数内部的子函数可以读取局部变量,因此,我理解闭包就是定义在一个函数内部的函数. 例子: var f1 = function() ...
- 对JavaScript中闭包的理解
在前端开发中闭包是一个很重要的知识点,是面试中一定会被问到的内容.之前我对闭包的理解主要是"通过闭包可以在函数外部能访问到函数内部的变量",对闭包运用的也很少,甚至自己写过闭包自己 ...
- 转:对JavaScript中闭包的理解
关于 const let var 总结: 建议使用 let ,而不使用var,如果要声明常量,则用const. ES6(ES2015)出现之前,JavaScript中声明变量只有 ...
- JavaScript中闭包的理解
1.什么是闭包 我个人理解闭包就是函数中嵌套函数,但是嵌套的那个函数必须是返回值,才构成闭包: <!DOCTYPE html> <html> <head> < ...
- 在Javascript中闭包(Closure)
在Javascript中闭包(Closure) 什么是闭包 “官方”的解释是:所谓“闭包”,指的是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分. ...
- javascript中 (function(){})();如何理解?
javascript中 (function(){})();如何理解? javascript中: (function(){})()是匿名函数,主要利用函数内的变量作用域,避免产生全局变量,影响整体页面环 ...
- javascript中闭包最简单的简绍
javascript中闭包是什么 JavaScript 变量可以是局部变量或全局变量.私有变量可以用到闭包.闭包就是将函数内部和函数外部连接起来的一座桥梁. 函数的闭包使用场景:比如我们想要一个函数来 ...
- 在JavaScript中闭包的作用和简单的用法
在JavaScript中闭包的作用和简单的用法 一.闭包的简介 作用域链:在js中只有函数有作用域的概念,由于函数内能访问函数外部的数据,而函数外部不能访问函数内部的数据,由上述形成一种作用域访问的链 ...
- Javascript中闭包的个人理解
Javascript的一个特殊点就在于它的闭包和回调特性,这两个特性让初学Javascript的我是云里雾里,至今仍在苦苦摸索与理解.在一番苦思之后,整理了一下资料,将自己的理解思路记录下来,以 ...
随机推荐
- linux用户,组,文件等操作
参考: https://blog.csdn.net/chengqiuming/article/details/78601977 , https://www.cnblogs.com/123-/p/4 ...
- 「自己开发直播」实现nginx-rtmp-module多频道输入输出与权限控制
之前写了一篇文章,利用nginx和nginx-rtmp-module实现直播. 不过,之前只是做到了能够直播而已,只能一个人推流,并没有实现多人多频道输入输出,也没有权限控制,只要知道rtmp的URL ...
- Java-Runoob:Java Number & Math 类
ylbtech-Java-Runoob:Java Number & Math 类 1.返回顶部 1. Java Number & Math 类 一般地,当需要使用数字的时候,我们通常使 ...
- 第七周作业——简单FTP
开发简单的FTP: 1. 用户登陆 2. 上传/下载文件 3. 不同用户家目录不同 4. 查看当前目录下文件 5. 充分使用面向对象知识 1.目录结构zuoye-ftp├── chenliang #用 ...
- Go - 开始
学习Go的缘由 由于LZ目前在使用docker,docker的编程语言使用的是“Go”,所以想更加深入的了解Docker(尝试着看懂source code)遂尝试了解下Golang. 安装 LZ用的是 ...
- html5的canvas方法的总结
canvas的方法 save()保存当前环境的状态 restore() 返回之前保存过的路径状态和属性 createEvent() getContext()返回一个对象,指出访问绘图功能必要的API ...
- springmvc 打包遇到的问题
1.测试有错误,过不去,mvn install -DSkipTests 2.设置resources路径,在pom.xml中添加 <build> <resources> < ...
- 导入城市文件数据(csv)格式demo
页面: js: 后台:
- WP8 MVVM设计模式
类似了Android里边的MVC模式, Windows Phone 有自己的Model-View-ViewModel模式,这种模式的作用就是为了Data和UI分离开来. 如果你英文较好的话,你可以不再 ...
- CORDIC逼近算法
现在开始学习CORDIC算法 学习的博文: (1)http://blog.csdn.net/liyuanbhu/article/details/8458769 三角函数计算,Cordic 算法入门 ...