前言:call、apply和bind都是为了改变某个函数运行时的this指向的对于前端人员来说,关于this的掌握程度,直接决定了前端水平的高低。下面我们就来简单浅显易懂的来看一下es5中常用的三种修改this指向的方法。

1.call()方法

function test(m,n){
console.log(this.abc);
}
test();//这里打印的是undefined
test.call({abc : 123});//这里打印的是123

如上代码所示,如果指定在全局环境下调用test方法,由于该函数是被window调用的,因此函数体内部的this是指向window的,但是window全局对象下又没有abc这个属性,因此打印出来的就是undefined(这里不考虑浏览器严格模式和非严格模式的区别)。

函数test如果是通过call方法来调用,那就不同了。call方法是每个函数建立的时候就有的方法,在调用call方法的时候,这个test函数会执行,同时函数体中的this的指向会自动修改指向到里面的对象了{abc:123},因此,打印的值就是123了。

function test(m,n){
console.log(this.abc);
console.log(m);
console.log(n);
}
test();//这里打印的是undefined
test.call({abc : 123});//这里打印的是this.abc是123 test.call({abc : 123},100,200);//这里打印的this.abc是,m是100,n是200

ps:如上方的代码所示,另外call方法也可以传入其他的参数。

2.apply()方法

apply()方法与call方法用法基本相同,不同点主要是call()方法的第二个参数和之后的参数可以是任意数据类型,而apply的第二个参数是数组类型或者arguments参数集合。

function fn(a,b,c){
  console.log(a,b,c);
}
fn.call(null,1,2,3);//打印的值是123
fn.apply(null,[1,2,3]);//打印的值是123

3.bind()方法(IE6,7,8不支持)

function test(m,n){
console.log(this.abc);
}
var test1 = test.bind({abc : 321});//这里修改test中的this指向为{abc:123},并且返回一个新函数并赋值给test1
test1();//这里打印321

bind()方法也能修改this指向,不过调用bind()方法不会执行test()函数,也不会改变test()函数本身,只会返回一个已经修改了this指向的新函数,这个新函数可以赋值给一个变量,调用这个变量新函数才能执行test1()。

如下方的代码所示,call()方法和bind()方法的区别在于1.bind的返回值是函数,并且不会自动调用执行,2.两者后面的参数的使用也不同。call 是 把第二个及以后的参数作为原函数的实参传进去,而bind 实参在其传入参数的基础上往后获取参数执行。

function fn(a,b,c){
console.log(a,b,c);
} var fn1 = fn.bind({abc : 123},600); fn(100,200,300) //这里会输出--> 100,200,300 fn1(100,200,300) //这里会输出--> 600,100,200 fn1(200,300) //这里会输出--> 600,200,300 fn.call({abc : 123},600) //这里会输出--> 600,undefined,undefined

其实这里说的还只是修改this指向的一些方法,另外还可以使用不同环境定义不同this变量、es6里面的箭头函数等方法来修改this指向,这都要根据实际项目情况来决定使用哪种方式。如果你觉得这篇文章对你有帮助就点个赞吧

js中修改this指向的方法(call,apply,bind)的更多相关文章

  1. js中改变this指向的call、apply、bind 方法使用

    前言: 由于js 中this的指向受函数运行环境的影响,指向经常改变,使得开发变得困难和模糊,所以在封装sdk,写一些复杂函数的时候经常会用到this 指向绑定,以避免出现不必要的问题,call.ap ...

  2. JS中两个重要的方法 call & apply 学习

    正题: Function.prototype.apply(instance,args)  //args 数组 Function.prototype.Call(instance,a1,a2)  //a1 ...

  3. JS中----this的指向和如何修改this的指向

    this this是js中的一个关键字,函数运行时自动生成的一个内部对象,只能在函数内部使用.我们要讨论的是 this 的指向. this就是函数运行时自动生成的一个内部对象 下面介绍一下几种情况下, ...

  4. 理解js中this的指向

         学习自原文  http://www.cnblogs.com/pssp/p/5216085.html后的一点小结(原文作者总结的很棒^_^)! 关于js中this的指向,在函数定义的时候还无法 ...

  5. js中this的指向

    在js中this的指向对于新手来说一定是个难题,但是如果你真正理解了的话,也就没什么问题啦,下面就来讲讲this吧. JS中,this的值取决于调用的模式(调用对象),而JS中共有4种调用模式: 1. ...

  6. JS中的this 指向问题

    我发现在对JS的学习中有很多朋友对this的指向问题还是有很大的误区或者说只是大致了解,但是一旦遇到复杂的情况就会因为this指向问题而引发各种bug. 对于之前学习过c或者是Java的朋友来说可能这 ...

  7. 轻松了解JS中this的指向

    JS中的this指向一直是个让人头疼的问题,想当初我学的是天昏地暗,查了好多资料,看的头都大了,跟他大战了那么多回合,终于把它搞定个七八分,其实往往都是我们复杂化了,现在就让大家轻松看懂this的指向 ...

  8. 判断js中各种数据的类型方法之typeof与0bject.prototype.toString讲解

    提醒大家,Object.prototype.toString().call(param)返回的[object class]中class首字母是大写,像JSON这种甚至都是大写,所以,大家判断的时候可以 ...

  9. JavaScript -- 时光流逝(五):js中的 Date 对象的方法

    JavaScript -- 知识点回顾篇(五):js中的 Date 对象的方法 Date 对象: 用于处理日期和时间. 1. Date对象的方法 <script type="text/ ...

随机推荐

  1. 看动画学算法之:doublyLinkedList

    目录 简介 doublyLinkedList的构建 doublyLinkedList的操作 头部插入 尾部插入 插入给定的位置 删除指定位置的节点 简介 今天我们来学习一下复杂一点的LinkedLis ...

  2. Radius协议-学习

    目录 RFC Radius 协议 Radius-学习 RADIUS协议的主要特征 客户端/服务器模式 安全的消息交互机制 良好的扩展性 AAA介绍 C/S结构 RADIUS在协议栈中的位置 RADIU ...

  3. 洛谷4630APIO2018铁人两项(圆方树+dp)

    QWQ神仙题啊(据说是今年第一次出现圆方树的地方) 首先根据题目,我们就是求对于每一个路径\((s,t)\)他的贡献就是两个点之间的点数,但是图上问题我并没有办法很好的解决... 这时候考虑圆方树,我 ...

  4. Java领域的表现层的三种技术--jsp、freemarker、velocity

    10月份忙碌的参加秋招并获得了5个成都.上海.广州等不同地区的工作offer,最终选择了广州,11月底来到公司实习,很快,就跟进了公司的项目了,原本以为可以和宣讲会时报的志愿一样--Java开发,但是 ...

  5. PHP文件上传漏洞与一句话木马

    靶子代码: 前端效果: 这是个没有任何防护的文件上传代码,同时还热心的附上了上传文件的路径. 我们写好php木马后,什么额外工作也不需要做,直接上传就行了.上传后在浏览器里访问该文件,其就会被执行. ...

  6. Manjaro安装Mariadb

    Mariadb是MySQL的一个复刻.由于MySQL被Oracle公司收购,MySQL的一些原始开发者担心MySQL会有开源方面的某些隐患,故领导开发了Mariadb. 如今,Mariadb已经作为许 ...

  7. [no_code][Beta]测试报告

    项目 内容 2020春季计算机学院软件工程(罗杰 任健) 2020春季计算机学院软件工程(罗杰 任健) 作业要求 测试报告 我们在这个课程的目标是 设计出一个OCR表单处理软件 这个作业在哪个具体方面 ...

  8. 6月8日 Scrum Meeting

    日期:2021年6月8日 会议主要内容概述: 确定6.9日下午两点到五点集中对接 初步确定主题配色和echarts默认图表颜色 一.进度情况 组员 负责 两日内已完成的工作 后两日计划完成的工作 工作 ...

  9. UltraSoft - Beta - Scrum Meeting 1

    Date: May 17th, 2020. Scrum 情况汇报 进度情况 组员 负责 今日进度 q2l PM.后端 维护Beta阶段文档 Liuzh 前端 增加删除操作按钮 Kkkk 前端 查询增加 ...

  10. BUAA-软件工程-个人总结与心得

    提问回顾以及个人总结 项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 提问回顾与个人总结 我在这个课程的目标是 学习软件开发的过程,团队之间的写作 ...