浅谈javascript的调试_基础知识

最近比较吐槽,大家都知道,现在web前端相对几年前来说已经变得很重了,各种js框架,各种面对对象,而且项目多了,就会提取公共模块。

  这些模块的UI展示都一样,不一样的就是后台逻辑,举个例子吧,我们做企业差旅的时候,通常都有一个成本中心的js公共模块,客户在预定机票的时候来填写这个成本中心,而这种成本中心分布在online,offline和app等预定端,这样也是方便后期和客户公司进行月结算。

  我们还知道,项目做大了,复杂化了,SOA化了之后,很多问题就来了,就像web中的一个理论,所有前端的数据都是不可信的,那对方团队的接口数据又何尝不是,以前项目小的时候,不会那么不自信,也只会在Logic error的时候会记录下日志,正常的业务流程一般很少记录,毕竟info日志看着不美观,而且还会消耗服务器带宽,也还会拖累web的性能。

  但是项目大了,当你某天在项目中遇到了奇怪的bug时,你靠着残缺不全的日志,好不容易用肉眼逐行追溯到了接口,但是参数太多,无法准确的还原接口的参数数据,但是你又100%的自信认定肯定就是接口的返回问题,但是又拿不出完整的报文,这时候你又没法找接口提供方,当时那个无奈呀,多想最好每行都有日志该多好啊。

  有了教训后,记流程日志的趋势越来越盛行,最终也酿造了一个年初的大事件,稀里糊涂的说了一大堆,web后端如此,那现在的重前端不也一样要记录日志么?我们知道既然是公共的js模块,那这个模块肯定自己封装了一些方法,肯定是绝对不可以让第三方程序去操作它自己的文本结点,比如下面这样:

复制代码 代码如下:

<!--third  module -->
公司:<input type="text" id="company" value="xxx有限公司" />
员工姓名:<input type="text" id="username" value="张三" />
<!-- -->
<script type="text/javascript">
    //成本中心
    var costCenter = (function () {
         var company = (document.getElementById("company") || "") && document.getElementById("company").value;
         var username = (document.getElementById("username") || "") && document.getElementById("username").value;
         var result = {
             getInfo: function () {
                 return { company: company, username: username };
             },
             validation: function () {
                 return Boolean(company && username);
             }
         };
         return result;
     })();
 </script>

  为了简化操作,第三方UI提供了公司名和员工姓名的UI结点,并且封装了一个costcenter类来提供读取方法,可以看到,我的预定程序只需读取costCenter.getInfo就好了,也起到了一个封装的作用。

  但是问题就出现在这里,项目实战中会因为各种原因导致在costcenter中取不到值,当然也可能是common ui的bug。

  但是当时你又不能非常确定是否真的取到了值,但是在逻辑上就算取不到值,原则上你也不能阻止订单提交,所以为了彻底追踪bug,就写了个logCenter单例类来记录日志。通常用js来记录log有这种方法。

<1> ajax

  这种方式很容易想到,但是你使用原生的xmlhttprequest的话,还需要考虑浏览器兼容,但不用原生的话,就要借助于第三方框架,比如jquery,但是毕竟还是有很多公司是不使用jquery的,所以这个要根据实际的需要来使用了。

复制代码 代码如下:

    //日志中心
    var logCenter = (function () {
        var result = {
            info: function (title, message) {
                //ajax操作
                $.get("http://xxx.com", { "title": title, "message": message }, function () {
                }, "post");
             }
         };
         return result;
     })();

<2>image

  我们的dom中有一个叫做image的对象,所以可以通过动态给它的src赋值来达到请求后台url的目的,同时在url中加上我们需要传递 title和message信息,这种动态给image.src的方式是不需要考虑浏览器兼容性的问题,非常不错。

复制代码 代码如下:

    //日志中心
    var logCenter = (function () {
        var result = {
            info: function (title, message) {
                //ajax操作
                $.get("http://xxx.com", { "title": title, "message": message }, function () {
                }, "post");
             },
             info_image: function (title, message) {
                 //image
                 var img = new Image();
                 img.src = "http://www.baidu.com?title=" + title + "&message=" + message + "&temp=" + (Math.random() * 100000);
             }
         };
         return result;
     })();

以上就是本文的主要内容了,后续我们将继续深入探讨

时间: 2024-12-24 21:38:13

浅谈javascript的调试_基础知识的相关文章

浅谈JavaScript函数节流_基础知识

浏览器中某些计算和处理要比其他的昂贵的多.例如,DOM操作比起非DOM交互需要更多的内存和CPU时间.连续尝试进行过多的DOM相关操作可能会导致 浏览器挂起,有时候甚至会崩溃.尤其在IE中使用onresize事件处理程序的时候容易发生,当调整浏览器大小的时候,该事件连续触发.在 onresize事件处理程序内部如果尝试进行DOM操作,其高频率的更改可能会让浏览器崩溃.      函数节流背后的基本思想是,某些代码不可以在没有间断的情况连续重复执行.第一次调用函数,创建一个定时器,在指定的时间间隔

浅谈JavaScript 框架分类_基础知识

如果是从内部架构与理念划分,目前JavaScript框架可以划分为5类. 第1种 出现的是以命名空间为导向的类库或框架,如创建一个数组用new Array(),生成一个对象用new Object(),完全的Java风格,因此我们就可以以某一对象为根,不断为它添加对象属性或二级对象属性来组织代码,金字塔般地垒叠起来.代表作如早期的YUI与EXT. 第2种 出现的是以类工厂为导向的框架,如著名的Prototype,还有mootools.Base2.Ten.它们基本上除了最基本的命名空间,其他模块都是

浅谈javascript回调函数_基础知识

把函数作为参数传入到另一个函数中.这个函数就是所谓的回调函数 经常遇到这样一种情况,某个项目的A层和B层是由不同的人员协同完成.A层负责功能funA,B层负责funcB.当B层要用到某个模块的数据,于是他对A层人员说,我需要你们提供满足某种需求的数据,你给我提供一个接口. A层的人员说:我给你提供数据,怎么展示和处理则是B的事情. 当然B层不可能为你每个需求都提供一个数据接口,B给A提供一个通过的接口.B得到数据,然后B写函数去展示. 即,你需要和其他人合作,别人提供数据,而你不需要关注别人获取

浅谈JavaScript Array对象_基础知识

Array 数组 1. 介绍       数组是值的有序集合.每个值叫做一个元素,而每个元素在数组中有一个位置,以数字表示,称为索引.JavaScript数组是无类型:数组元素可以是任意类型,并且同一个数组中的不同元素也可能有不同的类型. --<JavaScript权威指南(第六版)> 2. 定义 复制代码 代码如下: var names = new Array("张三", "李四", "王五"); //或者 var names =

浅谈Javascript 执行顺序_基础知识

Javascript是执行顺序是至上而下的,除非你特别说明, Javascript代码不会等到页面加载完毕后才执行.比如一个网页里含有以下HTML代码: 复制代码 代码如下: <div id="ele">welcome to www.jb51.net</div> 如果你在这行HTML代码前,加入如下Javascript代码: 复制代码 代码如下: <script type="text/javascript">  document.

浅谈javascript 归并方法_基础知识

ECMAScript5 还新增了2个归并数组的方法:reduce()和reduceRight().  这两个都会迭代数组的所有项         reduce():从第一项开始逐个遍历到最后.         reduceRight():从数组的最后一项开始,遍历到数组的第一项. 这两个方法都接受两个参数:在每一项上调用的函数(参数为:前一个值,当前值,项的索引,数组对象)  这个函数返回的任何值斗殴会作为第一个参数自动传给下一项.第一次迭代发生在数组的第二项上,          因此第一个参

浅谈javascript 迭代方法_基础知识

        五个迭代方法 都接受两个参数:要在每一项上运行的函数 和 运行该函数的作用域(可选)         every():对数组中的每一项运行给定函数.如果函数对每一项都返回true,则返回true.         filter():对数组中的每一项运行给定函数.返回该函数会返回true的项组成的数组.         forEach():对数组中每一项运行给定函数.该函数没有返回值.         map():对数组中每一项运行给定函数.返回每次函数调用的结果组成的函数.   

浅谈javascript中的constructor_基础知识

constructor,构造函数,对这个名字,我们都不陌生,constructor始终指向创建当前对象的构造函数. 这里有一点需要注意的是,每个函数都有一个prototype属性,这个prototype的constructor指向这个函数,这个时候我们修改这个函数的prototype时,就发生了意外.如 function Person(name,age){ this.name = name; this.age = age; } Person.prototype.getAge = function

介绍一个简单的JavaScript类框架_基础知识

 在写work-in-progress JavaScript book一书时,对于javascript继承体系,我花费了相当的时间,并在该过程中研究了各种不同的模拟经典类继承的方案.这些技术方案中,我最为推崇的是base2与Prototype的实现. 从这些方案中,应该能提炼出一个具有其思想内涵的框架,该框架须具有简单.可重用.易于理解并无依赖等特点,其中简单性与可用性是重点.以下是使用示例:   var Person = Class. extend ( { init: function (is