关于js的回调函数的一点看法

原文:关于js的回调函数的一点看法

      算了一下又有好几个月没写博客了,最近在忙公司android的项目,所以也就很少抽时间来写些东西了。刚闲下来,我就翻了翻之前看的东西。做了android之后更加感觉到手机端开发的重要性,现在做native App  和Web App是主流,也就是说现在各种基于浏览器的web app框架也会越来越火爆了,做js的也越来越有前途。我也决定从后端开发渐渐向前端开发和手机端开发靠拢,废话不说了,我们来切入正题“js的回调函数”相关的东西。

      说起回调函数,好多人虽然知道意思,但是还是一知半解。至于怎么用,还是有点糊涂。网上的一些相关的也没有详细的说一下是怎么回事,说的比较片面。下面我只是说说个人的一点理解,大牛勿喷。我们来看一下一个粗略的一个定义“函数a有一个参数,这个参数是个函数b,当函数a执行完以后执行函数b。那么这个过程就叫回调。”,这句话的意思是函数b以一个参数的形式传入函数a并执行,顺序是先执行a ,然后执行参数b,b就是所谓的回调函数。我们先来看下面的例子。

      

   function  a(callback){
      alert('a');
      callback.call(this);//或者是 callback(),  callback.apply(this),看个人喜好

   }
   function  b(){
       alert('b');
   }   //调用   a(b);

       这样的结果是先弹出 'a',再弹出‘b’。这样估计会有人问了“写这样的代码有什么意思呢?好像没太大的作用呢!”

       是的,其实我也觉得这样写没啥意思,“如果调用一个函数就直接在函数里面调用它不就行了”。我这只是给大家写个小例子,做初步的理解。真正写代码的过程中很少用这样无参数的,因为在大部分场景中,我们要传递参数。来个带参数的:

 

function  c(callback){
      alert('c');
      callback.call(this,'d');

    }

//调用
c(function(e){

    alert(e);
});

      这个调用看起来是不是似曾相识,这里e参数被赋值为'd',我们只是简单的赋值为字符窜,其实也可以赋值为对象。Jquery里面是不是也有个e参数,下面我们就来讲讲
Jquery里面的e参数是如何被回调赋值的。

       Jquery框架我想大家不陌生了,出来了好久,开发的时候都在用,比较简单,api网上搜起来很方便,上手快。在Jquery框架下,我们有时候要获取事件中的一些参数,比如我要获取当前点击的坐标,点击的元素对象。这个需求在Jquery里面好办  :

        $("#id").bind('click',function(e){

          //e.pageX ,e.pageY ,e.target.....各种数据

        });

        用起来倒是挺方便,其实这个e参数的赋值也是通过回调函数来实现的,这个参数是用回调参数给它赋予了一个对象值,仔细研究过JJquery源码的朋友应该发现了这一点。

还有Ajax里面   $.get('',{},function(data){})    data这个参数也是同样的原理。

        我们来看看Jquery事件对象里面是怎么应用回调函数的。

       为了方便,我简单的写了一下$相关的一些实现,之前写过“小谈Jquery”里面有比较接近框架实现的方法,我下面只是写一个简易的选择器。

      

<div  id="container"   style="width:200px;height:200px;background-Color:green;">
</div>

<script>
     var   _$=function (id)
               {
                     this.element=  document.getElementById(id);
                }
       _$.prototype={
            bind:function(evt,callback)
            {
                var   that=this;
                if(document.addEventListener)
                {
                    this.element.addEventListener(evt, function(e){
                        callback.call(this,that.standadize(e));
                    }  ,false);
                }
                else if(document.attachEvent)
                {
                    this.element.attachEvent('on'+evt,function(e){
                        callback.call(this,that.standadize(e));
                    });
                }
                else
                    this.element['on'+evt]=function(e){
                        callback.call(this,that.standadize(e));
                    };
            },
            standadize:function(e){
                 var  evt=e||window.event;
                 var  pageX,pageY,layerX,layerY;
                 //pageX  横坐标  pageY纵坐标   layerX点击处位于元素的横坐标   layerY点击处位于元素的纵坐标
                 if(evt.pageX)
                 {
                     pageX=evt.pageX;
                     pageY=evt.pageY;
                 }
                 else
                 {
                    pageX=document.body.scrollLeft+evt.clientX-document.body.clientLeft;
                    pageY=document.body.scrollTop+evt.clientY-document.body.clientLTop;
                 }
                 if(evt.layerX)
                 {

                     layerX=evt.layerX;
                     layerY=evt.layerY;
                 }
                 else
                 {
                     layerX=evt.offsetX;
                     layerXY=evt.offsetY;
                 }
                 return  {
                    pageX:pageX,
                    pageY:pageY,
                    layerX:layerX,
                    layerY:layerY
                 }

            }

       }
       window.$=function(id)
       {
          return  new _$(id);

       }

        $('container').bind('click',function(e){

            alert(e.pageX);
        });

        $('container1').bind('click',function(e){

             alert(e.pageX);
        });
</script>

View Code

这段代码我们主要看standadize函数的实现,兼容性的代码,就不多说了,返回的是一个对象  

     return  {
                    pageX:pageX,
                    pageY:pageY,
                    layerX:layerX,
                    layerY:layerY
                 }

 然后再看bind函数里面的代码    callback.call(this,that.standadize(e)),这段代码其实就是给e参数赋值了,是用callback回调实现的。

callback 函数被调用的时候传入的是匿名函数

         function(e){

        }

而callback.call(this,that.standadize(e))相当于是执行了这么一段代码  

        (function(e){
 
        })(standadize(e))

   这也是Jquery用回调函数比较经典的地方,e参数就是这么被赋值的,说了这些你们也大概有个了解了,以及怎么使用了。

    回调在各种框架中应用的比较多,有时候自己写一些东西的时候也可以根据实际情况用用看。

    如果觉得这篇文章不够详细,可以单独q我共同讨论下(见博客首页左上角),语言表达能力有所欠缺。感谢来访的博友,我会在后面继续增强个人技术以及语言水平,写出更好的博客,大家互相学习进步。

 

时间: 2024-10-28 21:02:01

关于js的回调函数的一点看法的相关文章

对js中回调函数的一些看法_javascript技巧

最近在忙公司android的项目,所以也就很少抽时间来写些东西了.刚闲下来,我就翻了翻之前看的东西.做了android之后更加感觉到手机端开发的重要性,现在做native App  和Web App是主流,也就是说现在各种基于浏览器的web app框架也会越来越火爆了,做js的也越来越有前途.我也决定从后端开发渐渐向前端开发和手机端开发靠拢,废话不说了,我们来切入正题"js的回调函数"相关的东西. 说起回调函数,好多人虽然知道意思,但是还是一知半解.至于怎么用,还是有点糊涂.网上的一些

js的回调函数详解_javascript技巧

现在做native App  和Web App是主流,也就是说现在各种基于浏览器的web app框架也会越来越火爆了,做js的也越来越有前途.我也决定从后端开发渐渐向前端开发和手机端开发靠拢,废话不说了,我们来切入正题"js的回调函数"相关的东西.       说起回调函数,好多人虽然知道意思,但是还是一知半解.至于怎么用,还是有点糊涂.网上的一些相关的也没有详细的说一下是怎么回事,说的比较片面.下面我只是说说个人的一点理解,大牛勿喷.我们来看一下一个粗略的一个定义"函数a有

js中回调函数问题,程序进不了回调函数

问题描述 js中回调函数问题,程序进不了回调函数 我这段代码的回调函数哪出错,请各位大神指教 function req(){ createRequest(); var zipcode=document.getElementById(""zipcode"").value; var url=""b.jsp?zipcode="" + escape(zipcode); request.open(""POST&quo

jsonp-小白:js中回调函数处理后的数据如何保存?

问题描述 小白:js中回调函数处理后的数据如何保存? 主要的函数为: function Ajax(asc, url, data, func) { $.ajax({ // asc: false, async: asc, //type: "post", //dataType: "json", type: "get", dataType: "jsonp", //jsonp: "Callback", // json

js中回调函数的执行顺序

问题描述 js中回调函数的执行顺序 代码是调用了地图api函数,里面有个回调函数,想在回调函数里把值赋给全局变量,但是回调函数之后的代码里全局变量的值没变,具体见代码: <script type="text/javascript"> //基本地图加载 var map = new AMap.Map("container", { resizeEnable: true, //地图中心点 zoom: 13 //地图显示的缩放级别 }); var g=18; AM

js自定义回调函数_javascript技巧

背景分析 首先看一段js的代码,主要实现添加的时候首先通过异步请求判断是否存在,如果不存在的话,在进行添加操作: function add(url,data) { var isExited = isExited(data); if(!isExited){ addRequest(url, data); } } 当我添加一个数据的时候,我首先通过判断是否在数据库中存在(当然,如果前后台彻底分离的话,不应该前端进行业务逻辑的判断,前端只应该,用来展示数据),首先,isExited()的请求是ajax请

js 异步操作回调函数如何控制执行顺序

 本文为大家讲解下js异步操作时回调函数如何控制执行顺序,感兴趣的朋友可以参考下 需求:  fun A() { asyn(parm1, parm2, onsuccess(){ }) ;}  fun B() {asyn(paem1, parm2, onsuccess(){}) ;}    函数B要求执行在函数A之后    异步执行  如果直接使用  A();  B();    是不能够满足执行条件的.    考虑将B作为回调函数传递给A,然后A再执行的onsucess中执行B函数  A(B); 

js 异步操作回调函数如何控制执行顺序_javascript技巧

需求: fun A() { asyn(parm1, parm2, onsuccess(){ }) ;} fun B() {asyn(paem1, parm2, onsuccess(){}) ;} 函数B要求执行在函数A之后 异步执行 如果直接使用 A(); B(); 是不能够满足执行条件的. 考虑将B作为回调函数传递给A,然后A再执行的onsucess中执行B函数 A(B); 即可实现功能需求. js是单线程的. 1.调用函数时,如果参数多于定义时的个数,则多余的参数将会被忽略,如果少于定义时的

js中回调函数的学习笔记_javascript技巧

回调函数是什么在学习之前还真不知道js回调函数怎么使用及作用了,下面本文章把我在学习回调函数例子给各位同学介绍一下吧,有需了解的同学不防进入参考. 回调函数原理: 我现在出发,到了通知你" 这是一个异步的流程,"我出发"这个过程中(函数执行),"你"可以去做任何事,"到了"(函数执行完毕)"通知你"(回调)进行之后的流程 例子 1.基本方法 <script language="javascript&q