最近在忙公司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中回调函数的一些看法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持小牛知识库。
本文向大家介绍js的回调函数详解,包括了js的回调函数详解的使用技巧和注意事项,需要的朋友参考一下 现在做native App 和Web App是主流,也就是说现在各种基于浏览器的web app框架也会越来越火爆了,做js的也越来越有前途。我也决定从后端开发渐渐向前端开发和手机端开发靠拢,废话不说了,我们来切入正题“js的回调函数”相关的东西。 说起回调函数,好多人虽然知道意思,但是
本文向大家介绍js自定义回调函数,包括了js自定义回调函数的使用技巧和注意事项,需要的朋友参考一下 背景分析 首先看一段js的代码,主要实现添加的时候首先通过异步请求判断是否存在,如果不存在的话,在进行添加操作: 当我添加一个数据的时候,我首先通过判断是否在数据库中存在(当然,如果前后台彻底分离的话,不应该前端进行业务逻辑的判断,前端只应该,用来展示数据),首先,isExited()的请求是aja
本文向大家介绍js函数调用方式有哪些?相关面试题,主要包含被问及js函数调用方式有哪些?时的应答技巧和注意事项,需要的朋友参考一下 function func() { console.log(1) } func(); func.apply(); func.call();
本文向大家介绍js回调函数仿360开机,包括了js回调函数仿360开机的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了js回调函数仿360开机的具体代码,供大家参考,具体内容如下 关键代码: 1、demo(最外面整个大盒子)的定位 固定定位,放在页面的右下方 span(关闭按钮)绝对定位在demo的右上方: 2、防止冒泡,因为span(关闭按钮)的父元素是demo, 所以不能直接写
本文向大家介绍JS回调函数深入理解,包括了JS回调函数深入理解的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了JS回调函数。分享给大家供大家参考,具体如下: 一、前奏 在谈回调函数之前,先看下下面两段代码: 不妨猜测一下代码的结果。 如果你测试了,就会发现: 只写变量名 say 返回的将会是 say方法本身,以字符串的形式表现出来。 而在变量名后加()如say()返回的就会使say方
我找到了一些很好的SO链接(如何从异步回调函数返回值?以及从node.js中的回调函数返回值等),但它们并不是不能为我的问题提供解决方案。 我的问题:能够得到异步调用的结果,但我如何使用这个结果返回我的函数? 这里获取callBackResponse的值为true或false,并希望将该值用作: