闭包是什么?

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

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. k-means算法Java一维实现

    这里的程序稍微有点变形.k_means方法返回K-means聚类的若干中心点.代码: import java.util.ArrayList; import java.util.Collections; ...

  2. awk&sed 小实例

    1.打印文件奇数行sed -n 'p;n'sed 'n;d' sed -n '$!N;P'sed -n '1~2p'awk 'i=!i'awk 'NR%2'2.打印文件偶数行sed -n 'n;p's ...

  3. CFile用法(转)

    一.各种关于文件的操作在程序设计中是十分常见,如果能对其各种操作都了如指掌,就可以根据实际情况找到最佳的解决方案,从而在较短的时间内编写出高效的代码,因而熟练的掌握文件操作是十分重要的.本文将对Vis ...

  4. Python基本序列-字典

    Python 基本序列-字典 字典(dict)是"键-值 对"的无序可变序列,字典中的每个元素包含两部分,"键"和"值". 字典中的&quo ...

  5. 使用DOSGi在OSGi环境下发布Web Services

    前言 Apache CXF是一个开源的服务框架项目,而Distributed OSGi子项目提供了基于OSGi远程服务规范的分布式组件实现.它使用Web Services,HTTP上的SOAP手段实现 ...

  6. node的express中间件之session

    虽然session与cookie是分开保存的.但是session中的数据经过加密处理后默认保存在一个cookie中.因此在使用session中间件之前必须使用cookieParser中间件. app. ...

  7. Visual Studio Online 删除项目

    TFS Online在经过一段很长时间的预览阶段后,现在已经改名成Visual Studio Online(简称VS Online),正式成为微软的开发测试云在线服务.撸主最近在上面建了几个测试项目玩 ...

  8. 【洛谷】P1095 守望者的逃离(递推)

    题目描述 恶魔猎手尤迪安野心勃勃,他背叛了暗夜精灵,率领深藏在海底的娜迦族企图叛变.守望者在与尤迪安的交锋中遭遇了围杀,被困在一个荒芜的大岛上.为了杀死守望者,尤迪安开始对这个荒岛施咒,这座岛很快就会 ...

  9. mysql where语句中 or 和 and连用注意点

    在mysql中,经常会遇到这样的情况,在写条件语句where时,可能会同时有多个条件的“或”或者“与”,但经常会达不到效果,经百度,本人发现一个where语句中同时出现条件的“与”或者“或的时候”,要 ...

  10. Python小知识点(2)

    1.简述Python的运行过程 在说这个问题之前,我们先来说两个概念,PyCodeObject和pyc文件. 我们在硬盘上看到的pyc自然不必多说,而其实PyCodeObject则是Python编译器 ...