js闭包

原创 2016年03月20日 21:55:57

   

   引言


   在公司中需要写一个js脚本来进行网站的统计,实现类似百度统计或者站长统计的功能,在实现的过程中自己


感觉写的代码还是可以的,因为之前的js代码都是这些写,但是在组长代码走查的时候却非常的不满意,因为我们在


js中写的方法都是全局的方法,因为我们写的东西需要嵌入到别人的界面中,所以这些全局的东西很可能会和别人的


东西重名从而引发错误,所以说组长就给我留下一句话:用js闭包包起来。


   变量作用域


   我们都非常的熟悉变量的作用域就分为:全局变量和局部变量。js中在函数的内部可以直接读取全局变量。


   Js代码

        

          var n=999;
        function f1(){
          alert(n);
        }
        f1(); // 999


  另一方面,在函数外部自然无法读取函数内的局部变量。


  Js代码


  function f1(){


    var n=999;
  }
  alert(n); // error


   我们还需要注意,在js中如果声明变量的时候一定要用var命令,否则实际上声明了一个全局的变量!


   function f1(){
    n=999;
  }
  f1();
  alert(n); // 999


   如何从外部读取全局变量?


   我们需要得到函数内部的全局变量该怎么办呢?。在正常情况下我们是做不到的,要想这么实现我们必须想一


些办法——在函数的内部在定义一个函数:

 function f1(){
    n=999;
    function f2(){
      alert(n); // 999
    }
  }


 在上面的代码中,函数f2就被包括在函数f1内部,这时f1内部的所有局部变量,对f2都是可见的。但是反过来就不


行,f2内部的局部变量,对f1 就是不可见的。这就是Javascript语言特有的“链式作用域”结构(chain scope),


子对象会一级一级地向上寻找所有父对象的变量。所以,父对象的所有变量,对子对象都是可见的,反之则不成立。


既然f2可以读取f1中的局部变量,那么只要把f2作为返回值,我们不就可以在f1外部读取它的内部变量了吗!

  

  function f1(){
    n=999;
    function f2(){
      alert(n);
    }
    return f2;
  }
  var result=f1();
  result(); // 999

   闭包的概念


   在上面的代码中f2函数,就是闭包。各种专业文献上的“闭包”(closure)定义非常抽象,很难看懂。我的理


解是,闭包就是能够读取其他函数内部变量的函数。由于在Javascript语言中,只有函数内部的子函数才能读取局部


变量,因此可以把闭包简单理解成“定义在一个函数内部的函数”。所以,在本质上,闭包就是将函数内部和函数外


部连接起来的一座桥梁。


   下面来分享一下我们在项目中用到的js闭包的写法:


 

(function () {


    function getPageTitle() {

        return document.title;
    }

    function getBrowerLanguage() {

        var browerLanguage = !navigator.browserLanguage ? navigator.language : navigator.browserLanguage;

        return browerLanguage;
    }

    /**
     * 当前页面地址#后的部分
     */
    function getLastUrl() {

        var url = window.location.hash;

        if (!url) {
            return null;
        }
        else {
            return url.toString().split("#")[1];

        }

    }

    function GetRandomNum() {
        var arr = document.cookie.match(new RegExp("(^| )" + "statisticssCookie=([^;]*)(;|$)"));
        if (arr != null) {
            return arr[2];
        } else {
            var tempRandomNum = guid();
            document.cookie = "statisticssCookie = " + tempRandomNum;

            return tempRandomNum;
        }


    }

    function guid() {

        function S4() {
            return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1);
        }
        return (S4() + S4() + "-" + S4() + "-" + S4() + "-" + S4() + "-" + S4() + S4() + S4());
    }

    function addJs() {

        var url = "http://localhost:10086/tongji/tongji/do?title=" + getPageTitle() + "&browerLanguage=" + getBrowerLanguage() + "&lastUrl=" + getLastUrl() + "&upFlag=" + GetRandomNum();

        var head = document.getElementsByTagName('head')[0];
        var js = document.createElement('script');
        js.type = 'text/javascript';
        js.src = url;
        head.appendChild(js);
    }
    window.statistics = addJs;//将addJs这个方法挂在window下面,这样在外界是可以访问的,否则外界永不能访问到我写的方法
    document.ready = addJs();//DOM树加载完成后执行
})(window)

   

   小结


   在开始的时候组长就问我会不会js闭包函数,因为如果不会闭包写不出很好的代码。写的代码都非常的粗糙,


所以说我们在写代码的时候,不能仅仅满足功能实现,而且需要考虑一些其他方面的东西。当然js闭包在使用的时候


也有一些弊端,所以我们在使用的时候也需要综合全面的信息考虑。

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

js闭包实例

  • 2016年12月17日 17:17
  • 84KB
  • 下载

js闭包写法学习demo

  • 2014年12月11日 18:06
  • 4KB
  • 下载

js 作用域链&内存回收&变量&闭包

闭包主要涉及到js的几个其他的特性:作用域链,垃圾(内存)回收机制,函数嵌套,等等 一、作用域链:函数在定义的时候创建的,用于寻找使用到的变量的 值的一个索引,而他内部的规则是,把函数自身的本地变量...

js闭包理解之倒计时

  • 2014年07月11日 15:07
  • 587B
  • 下载

什么是js闭包

  • 2013年08月28日 17:03
  • 122KB
  • 下载

javascript深入理解js闭包

一、变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域。 变量的作用域无非就是两种:全局变量和局部变量。 Javascript语言的特殊之处,就在于函数内部可以直接...
  • ryelqy
  • ryelqy
  • 2017年07月11日 09:52
  • 135

js闭包详解

  • 2014年07月16日 23:25
  • 1KB
  • 下载

javascript深入理解js闭包

javascript深入理解js闭包 闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现。...
  • educast
  • educast
  • 2017年04月07日 15:47
  • 346

想学JS的原型和闭包吗?COME ON(14)

先解释一下什么是“自由变量”。在A作用域中使用的变量x,却没有在A作用域中声明(即在其他作用域中声明的),对于A作用域来说,x就是一个自由变量。如下图如上程序中,在调用fn()函数时,函数体中第6...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:js闭包
举报原因:
原因补充:

(最多只允许输入30个字)