闭包是什么?

通过闭包,子函数得以访问父函数的上下文环境,即使父函数已经结束执行。

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中闭包的理解的更多相关文章

  1. 关于javascript中闭包的理解

    闭包就是能够读取其他函数内部变量的函数. 在javascript中,只有函数内部的子函数可以读取局部变量,因此,我理解闭包就是定义在一个函数内部的函数. 例子: var f1 = function() ...

  2. 对JavaScript中闭包的理解

    在前端开发中闭包是一个很重要的知识点,是面试中一定会被问到的内容.之前我对闭包的理解主要是"通过闭包可以在函数外部能访问到函数内部的变量",对闭包运用的也很少,甚至自己写过闭包自己 ...

  3. 转:对JavaScript中闭包的理解

    关于 const     let      var  总结: 建议使用 let  ,而不使用var,如果要声明常量,则用const. ES6(ES2015)出现之前,JavaScript中声明变量只有 ...

  4. JavaScript中闭包的理解

    1.什么是闭包 我个人理解闭包就是函数中嵌套函数,但是嵌套的那个函数必须是返回值,才构成闭包: <!DOCTYPE html> <html> <head> < ...

  5. 在Javascript中闭包(Closure)

    在Javascript中闭包(Closure) 什么是闭包 “官方”的解释是:所谓“闭包”,指的是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分. ...

  6. javascript中 (function(){})();如何理解?

    javascript中 (function(){})();如何理解? javascript中: (function(){})()是匿名函数,主要利用函数内的变量作用域,避免产生全局变量,影响整体页面环 ...

  7. javascript中闭包最简单的简绍

    javascript中闭包是什么 JavaScript 变量可以是局部变量或全局变量.私有变量可以用到闭包.闭包就是将函数内部和函数外部连接起来的一座桥梁. 函数的闭包使用场景:比如我们想要一个函数来 ...

  8. 在JavaScript中闭包的作用和简单的用法

    在JavaScript中闭包的作用和简单的用法 一.闭包的简介 作用域链:在js中只有函数有作用域的概念,由于函数内能访问函数外部的数据,而函数外部不能访问函数内部的数据,由上述形成一种作用域访问的链 ...

  9. Javascript中闭包的个人理解

       Javascript的一个特殊点就在于它的闭包和回调特性,这两个特性让初学Javascript的我是云里雾里,至今仍在苦苦摸索与理解.在一番苦思之后,整理了一下资料,将自己的理解思路记录下来,以 ...

随机推荐

  1. spring加载bean报错:expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}

    看具体报错日志: 警告: Unable to proxy interface-implementing method [public final void cn.wlf.selection.proto ...

  2. mysql innodb引擎事务的隔离级别

    一.事务的基本要素(ACID) 1.原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节.事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有 ...

  3. php处理字符串格式的计算表达式

    有时候我们对每一种产品都有一个提成公式,而这个计算提成的公式是以字符串格式存在表中的 当我们用这个计算公式时,他并不像我们写的:$a=2+3*5;这样简单的能计算出结果,而它是个字符串 所以,我们就必 ...

  4. python 多线程要点

    要点整理 多线程 #coding=utf-8 import threading from time import ctime,sleep def music(func): for i in range ...

  5. 页面初始加载的是默认刷新一次(f5)

    参考找不到了,不好意思.. 两种可以都试一下,解决问题就好了. 1.----------- <script type="text/javascript"> window ...

  6. 设置itemcontrol的item点击前后不同状态

    转自:http://www.cnblogs.com/linzheng/p/3764300.html <Page.Resources> <!--选中数据项的样式--> <D ...

  7. 对Node的优点和缺点提出了自己的看法?

    (优点)因为Node是基于事件驱动和无阻塞的,所以非常适合处理并发请求, 因此构建在Node上的代理服务器相比其他技术实现(如Ruby)的服务器表现要好得多. 此外,与Node代理服务器交互的客户端代 ...

  8. Python Object Oriented

    1. Creating class class className: 'Optional class documentation string' class_suite The class has a ...

  9. 怎么分辨linux系统是虚拟机还是物理机

    用lspci -b|grep "VMware"抓取系列信息,即表明此系统的宿主机是基于VMware虚拟出来的,别的可以照葫芦画瓢来!

  10. django第一课大概了解

    项目目录介绍: -------- manage.py : Django项目里面的工具,通过它可以调用django shell和数据库等. mysite/ 主要是项目配置的信息,通常一次生成后不需要其他 ...