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


Posted in Javascript onAugust 29, 2016

最近在忙公司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>

这段代码我们主要看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参数就是这么被赋值的,说了这些你们也大概有个了解了,以及怎么使用了。

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

以上这篇对js中回调函数的一些看法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jQuery ajax在GBK编码下表单提交终极解决方案(非二次编码方法)
Oct 20 Javascript
js/ajax跨越访问-jsonp的原理和实例(javascript和jquery实现代码)
Dec 27 Javascript
javascript使用 concat 方法对数组进行合并的方法
Sep 08 Javascript
Vue.js中数组变动的检测详解
Oct 12 Javascript
jQuery中$.ajax()方法参数解析
Oct 22 Javascript
Node.js websocket使用socket.io库实现实时聊天室
Feb 20 Javascript
Webpack框架核心概念(知识点整理)
Dec 22 Javascript
使用vue-cli3新建一个项目并写好基本配置(推荐)
Apr 24 Javascript
小程序实现列表展开收起效果
Jul 29 Javascript
JavaScript 几种循环方式以及模块化的总结
Sep 03 Javascript
国庆节到了,利用JS实现一个生成国庆风头像的小工具 详解实现过程
Oct 05 Javascript
Javascript中Microtask和Macrotask鲜为人知的知识点
Apr 02 Javascript
Web打印解决方案之普通报表打印功能
Aug 29 #Javascript
jQuery获取select选中的option的value值实现方法
Aug 29 #Javascript
js 判断各种数据类型的简单方法(推荐)
Aug 29 #Javascript
Web打印解决方案之证件套打的实现思路
Aug 29 #Javascript
浅谈js数据类型判断与数组判断
Aug 29 #Javascript
判断js的Array和Object的实现方法
Aug 29 #Javascript
基于MVC+EasyUI的web开发框架之使用云打印控件C-Lodop打印页面或套打报关运单信息
Aug 29 #Javascript
You might like
自动分页的不完整解决方案
2007/01/12 PHP
PHP中Session和Cookie是如何操作的
2015/10/10 PHP
PHP对象链式操作实现原理分析
2016/10/09 PHP
YII框架中使用memcache的方法详解
2017/08/02 PHP
javascript数据结构之二叉搜索树实现方法
2015/11/25 Javascript
Spring mvc 接收json对象
2015/12/10 Javascript
JS自定义混合Mixin函数示例
2016/11/26 Javascript
详解angular2采用自定义指令(Directive)方式加载jquery插件
2017/02/09 Javascript
详解基于Angular4+ server render(服务端渲染)开发教程
2017/08/28 Javascript
微信小程序实现点击按钮修改view标签背景颜色功能示例【附demo源码下载】
2017/12/06 Javascript
浅谈vue自定义全局组件并通过全局方法 Vue.use() 使用该组件
2017/12/07 Javascript
基于打包工具Webpack进行项目开发实例
2018/05/29 Javascript
iview tabs 顶部导航栏和模块切换栏的示例代码
2019/03/04 Javascript
微信小程序实现上传图片裁剪图片过程解析
2019/08/22 Javascript
小程序角标的添加及绑定购物车数量进行实时更新的实现代码
2020/12/07 Javascript
python逐行读取文件内容的三种方法
2014/01/20 Python
python从入门到精通(DAY 3)
2015/12/20 Python
使用NumPy和pandas对CSV文件进行写操作的实例
2018/06/14 Python
python协程之动态添加任务的方法
2019/02/19 Python
浅谈Python反射 &amp; 单例模式
2019/03/21 Python
tesserocr与pytesseract模块的使用方法解析
2019/08/30 Python
Python pip 安装与使用(安装、更新、删除)
2019/10/06 Python
python调用Matplotlib绘制分布点图
2019/10/18 Python
HTML5 WebSocket实现点对点聊天的示例代码
2018/01/31 HTML / CSS
Shopee马来西亚:随拍即卖,最佳行动电商拍卖平台
2017/06/05 全球购物
英国领先的在线礼品店:Getting Personal
2019/09/24 全球购物
广州品高软件.net笔面试题目
2012/04/18 面试题
如何利用XMLHTTP检测URL及探测服务器信息
2013/11/10 面试题
2014年父亲节活动方案
2014/03/06 职场文书
《三顾茅庐》教学反思
2014/04/10 职场文书
学校文明单位申报材料
2014/05/06 职场文书
刑事辩护授权委托书范本
2014/10/17 职场文书
蜗居观后感
2015/06/11 职场文书
公司欠款证明
2015/06/24 职场文书
Java 语言中Object 类和System 类详解
2021/07/07 Java/Android
试用1103暨1103、1101同门大比武 [ DAIWEI ]
2022/04/05 无线电