位置: 编程技术 - 正文

跟我学习javascript的call(),apply(),bind()与回调(java教程 视)

编辑:rootadmin

推荐整理分享跟我学习javascript的call(),apply(),bind()与回调(java教程 视),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:java script,教程java,java script入门,java learning,java script怎么学,java script,java learning,java script怎么学,内容如对您有帮助,希望把文章链接给更多的朋友!

一、call(),apply(),bind()方法

JavaScript 中通过call或者apply用来代替另一个对象调用一个方法,将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。简单的说就是改变函数执行的上下文,这是最基本的用法。两个方法基本区别在于传参不同。

call(obj,arg1,arg2,arg3); call第一个参数传对象,可以是null。参数以逗号分开进行传值,参数可以是任何类型。apply(obj,[arg1,arg2,arg3]); apply第一个参数传对象,参数可以是数组或者arguments 对象。1、语法 先来看看JS手册中对call的解释:

call 方法 调用一个对象的一个方法,以另一个对象替换当前对象。

call([thisObj[,arg1[, arg2[, [,.argN]]]]])参数

thisObj可选项。将被用作当前对象的对象。 arg1, arg2, , arg可选项。将被传递方法参数序列。说明 call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。

如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj。说明白一点其实就是更改对象的内部指针,即改变对象的this指向的内容。这在面向对象的js编程过程中有时是很有用的。

2、用法

因为function也是对象,所以每个函数都包含两个非继承而来的方法:apply()和call()。这两个方法的用途都是在特定的作用域中调用函数,实际上等于设置函数体内this 对象的值。首先,apply()方法接收两个参数:一个是在其中运行函数的作用域,另一个是参数数组。其中,第二个参数可以是Array 的实例,也可以是arguments 对象。例如:

在上面这个例子中,callSum1()在执行sum()函数时传入了this 作为this 值(因为是在全局作用域中调用的,所以传入的就是window 对象)和arguments 对象。而callSum2 同样也调用了sum()函数,但它传入的则是this 和一个参数数组。这两个函数都会正常执行并返回正确的结果。

在严格模式下,未指定环境对象而调用函数,则this 值不会转型为window。除非明确把函数添加到某个对象或者调用apply()或call(),否则this 值将是undefined

3、不同点

call()方法与apply()方法的作用相同,它们的区别仅在于接收参数的方式不同。对于call()方法而言,第一个参数是this 值没有变化,变化的是其余参数都直接传递给函数。换句话说,在使用call()方法时,传递给函数的参数必须逐个列举出来,如下面的例子所示。

在使用call()方法的情况下,callSum()必须明确地传入每一个参数。结果与使用apply()没有什么不同。至于是使用apply()还是call(),完全取决于你采取哪种给函数传递参数的方式最方便。如果你打算直接传入arguments 对象,或者包含函数中先接收到的也是一个数组,那么使用apply()肯定更方便;否则,选择call()可能更合适。(在不给函数传递参数的情况下,使用哪个方法都无所谓) 。

4、扩充函数运行的作用域

事实上,传递参数并非apply()和call()真正的用武之地;它们真正强大的地方是能够扩充函数 赖以运行的作用域。下面来看一个例子。

这个例子是在前面说明this 对象的示例基础上修改而成的。这一次,sayColor()也是作为全局函数定义的,而且当在全局作用域中调用它时,它确实会显示”red”——因为对this.color 的求值会转换成window.color 的求值。而sayColor.call(this)和sayColor.call(window),则是两种显式地在全局作用域中调用函数的方式,结果当然都会显示”red”。但是,当运行sayColor.call(o)时,函数的执行环境就不一样了,因为此时函数体内的this 对象指向了o,于是结果显示的是”blue”。使用call()(或apply())来扩充作用域的最大好处,就是对象不需要与方法有任何耦合关系。

在前面例子的第一个版本中,我们是先将sayColor()函数放到了对象o 中,然后再通过o 来调用它的;而在这里重写的例子中,就不需要先前那个多余的步骤了。

5、bind()方法

最后再来说 bind() 函数,上面讲的无论是 call() 也好, apply() 也好,都是立马就调用了对应的函数,而 bind() 不会, bind() 会生成一个新的函数,bind() 函数的参数跟 call() 一致,第一个参数也是绑定 this 的值,后面接受传递给函数的不定参数。 bind() 生成的新函数返回后,你想什么时候调就什么时候调,

在这里,sayColor()调用bind()并传入对象o,创建了objectSayColor()函数。object-SayColor()函数的this 值等于o,因此即使是在全局作用域中调用这个函数,也会看到”blue”。

支持bind()方法的浏览器有IE9+、Firefox 4+、Safari 5.1+、Opera +和Chrome。

二、call(),apply()的继承和回调

跟我学习javascript的call(),apply(),bind()与回调(java教程 视)

类的继承

先来看这个例子:

这样 webDever类就继承Person类,Person.call(this,name,age) 的 意思就是使用 Person构造函数(也是函数)在this对象下执行,那么 webDever就有了Person的所有属性和方法,test对象就能够直接调用Person的方法以及属性了

用于回调 call 和 apply在回调行数中也非常有用,很多时候我们在开发过程中需要对改变回调函数的执行上下文,最常用的比如ajax或者定时什么的,一般情况下,Ajax都是全局的,也就是window对象下的,来看这个例子:

这里

中的 this.name就能直接取到album对象中的name属性了。

三 、回调函数

说起回调函数,好多人虽然知道意思,但是还是一知半解。至于怎么用,还是有点糊涂。网上的一些相关的也没有详细的说一下是怎么回事,说的比较片面。下面我只是说说个人的一点理解,大牛勿喷。

定义 回调是什么? 看维基的 Callback_(computer_programming) 条目:

In computer programming, a callback is a reference to a piece of executable code that is passed as an argument to other code.

在JavaScript中,回调函数具体的定义为:函数A作为参数(函数引用)传递到另一个函数B中,并且这个函数B执行函数A。我们就说函数A叫做回调函数。如果没有名称(函数表达式),就叫做匿名回调函数。

举个例子:

你有事去隔壁寝室找同学,发现人不在,你怎么办呢? 方法1,每隔几分钟再去趟隔壁寝室,看人在不 方法2,拜托与他同寝室的人,看到他回来时叫一下你前者是轮询,后者是回调。那你说,我直接在隔壁寝室等到同学回来可以吗?可以啊,只不过这样原本你可以省下时间做其他事,现在必须浪费在等待上了。把原来的非阻塞的异步调用变成了阻塞的同步调用。JavaScript的回调是在异步调用场景下使用的,使用回调性能好于轮询。因此callback 不一定用于异步,一般同步(阻塞)的场景下也经常用到回调,比如要求执行某些操作后执行回调函数。

一个同步(阻塞)中使用回调的例子,目的是在func1代码执行完成后执行func2。

异步回调的例子:

回调什么时候执行

回调函数,一般在同步情境下是最后执行的,而在异步情境下有可能不执行,因为事件没有被触发或者条件不满足。另外,最好保证回调存在且必须是函数引用或者函数表达式:

(callback && typeof(callback) === "function") && callback();我们来看一下一个粗略的一个定义“函数a有一个参数,这个参数是个函数b,当函数a执行完以后执行函数b。那么这个过程就叫回调。”,这句话的意思是函数b以一个参数的形式传入函数a并执行,顺序是先执行a ,然后执行参数b,b就是所谓的回调函数。我们先来看下面的例子。

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

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

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

回调函数的使用场合

资源加载:动态加载js文件后执行回调,加载iframe后执行回调,ajax操作回调,图片加载完成执行回调,AJAX等等。 DOM事件及Node.js事件基于回调机制(Node.js回调可能会出现多层回调嵌套的问题)。 setTimeout的延迟时间为0,这个hack经常被用到,settimeout调用的函数其实就是一个callback的体现 链式调用:链式调用的时候,在赋值器(setter)方法中(或者本身没有返回值的方法中)很容易实现链式调用,而取值器(getter)相对来说不好实现链式调用,因为你需要取值器返回你需要的数据而不是this指针,如果要实现链式方法,可以用回调函数来实现 setTimeout、setInterval的函数调用得到其返回值。由于两个函数都是异步的,即:他们的调用时序和程序的主流程是相对独立的,所以没有办法在主体里面等待它们的返回值,它们被打开的时候程序也不会停下来等待,否则也就失去了setTimeout及setInterval的意义了,所以用return已经没有意义,只能使用callback。callback的意义在于将timer执行的结果通知给代理函数进行及时处理。

当函数的实现过程非常漫长,你是选择等待函数完成处理,还是使用回调函数进行异步处理呢?这种情况下,使用回调函数变得至关重要,例如:AJAX请求。若是使用回调函数进行处理,代码就可以继续进行其他任务,而无需空等。实际开发中,经常在javascript中使用异步调用,甚至在这里强烈推荐使用!

下面有个更加全面的使用AJAX加载XML文件的示例,并且使用了call()函数,在请求对象(requested object)上下文中调用回调函数。

我们请求异步处理,意味着我们开始请求时,就告诉它们完成之时调用我们的函数。在实际情况中,onreadystatechange事件处理程序还得考虑请求失败的情况,这里我们是假设xml文件存在并且能被浏览器成功加载。这个例子中,异步函数分配给了onreadystatechange事件,因此不会立刻执行。

最终,第二个console.log语句先执行,因为回调函数直到请求完成才执行。

标签: java教程 视

本文链接地址:https://www.jiuchutong.com/biancheng/384620.html 转载请保留说明!

上一篇:跟我学习javascript的函数调用和构造函数调用(java script教程)

下一篇:常用javascript表单验证汇总(javascript常用的数据类型有哪些)

  • 营业额超500万会罚款吗
  • 只报税不做账有什么后果?
  • 以前年度所得税滞纳金的账务处理
  • 租赁合同印花税双方都要交吗
  • 环保税计税依据怎么算
  • 美团代金券是抵用券吗
  • 小企业会计准则会计科目表
  • 没有进出口经营权
  • 定额发票不够用可以申请额度要交税吗
  • 融资租赁的服务费的标准
  • 汇兑还款会计分录
  • 营改增后如何纳税
  • 无法收回的款项怎么记账
  • 可以给行政事业单位开增值税专用发票吗
  • 电子税务局里的利润表,本月金额是填累计数吗
  • 在建工程的折旧费计入什么科目
  • 政府奖励如何记账
  • 增值税罚款怎么做凭证
  • 托收凭证的会计科目
  • 税务局怎么核定征收股权转让的
  • PHP:Memcached::appendByKey()的用法_Memcached类
  • 工程审计的目的包括哪些
  • 如何判定增值税发票真伪
  • 向政府购买土地使用权
  • 【安装 】
  • 股票发行费用怎么算
  • php中false的作用
  • 材料采购业务流程
  • 企业收回应收账款会计分录
  • “Property or method “***“ is not defined on the instance but referenced during render.”报错的原因及解决方案
  • 太平鸟的翅膀上有几道红羽毛
  • php的file函数
  • thinkphp框架作用
  • 框架 frame
  • 微信小程序下拉菜单怎么做
  • react-router6.4+的项目种路由实现方式(列举两种)
  • 其他非流动资产是会计科目吗
  • 稿费演出费等劳务收入算工资吗
  • 消耗性生物资产的账务处理
  • 投资收益主要包括两大类收益
  • 自然人三方协议支付宝怎么处理
  • 季度所得税收入大于成本利润是负号
  • dedecms官网
  • 钢筋增值税专票几个点
  • 以发行股票作为对价取得企业的股权
  • 季节性临时工什么意思
  • 资本化费用为什么会减少
  • 水泥建材销售公司有哪些
  • 工业销售产值是销售收入吗
  • 出口货物预收账款分录
  • 个税起征点调整最新消息
  • 报销烟酒的分录是什么
  • 商业汇票的会计核算
  • 享受所得税减免优惠的生产性外商投资企业包括
  • 车子购买的保险
  • 高价购买股权
  • 劳务成本如何核算
  • 应付票据在资产负债表怎么填列
  • 买公司的钱计入什么科目
  • 航天开票系统怎么导出已开票明细
  • 企业经营规模小怎么办
  • win10注册表主键
  • linux常用的几种压缩工具
  • KunlunPlatform.exe是什么进程?KunlunPlatform.exe是安全的程序吗?
  • xp能不能升级win10
  • windows10周年更新
  • windows8快速启动设置
  • windows8启动管理器
  • win7系统如何屏幕放满屏幕
  • Tutorial 3: First Triangle
  • 攻击判定是什么意思
  • 如何使用开塞露排便
  • jquery旋转动画
  • android mat
  • jquery限制字符长度
  • javascript原生函数的源代码
  • 税务异地协查系统管理办法
  • 税务筹划企业所得税案例分析题
  • 什么是深入调研工作
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设