js中修改this指向的方法(call,apply,bind)
前言: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)的更多相关文章
- js中改变this指向的call、apply、bind 方法使用
前言: 由于js 中this的指向受函数运行环境的影响,指向经常改变,使得开发变得困难和模糊,所以在封装sdk,写一些复杂函数的时候经常会用到this 指向绑定,以避免出现不必要的问题,call.ap ...
- JS中两个重要的方法 call & apply 学习
正题: Function.prototype.apply(instance,args) //args 数组 Function.prototype.Call(instance,a1,a2) //a1 ...
- JS中----this的指向和如何修改this的指向
this this是js中的一个关键字,函数运行时自动生成的一个内部对象,只能在函数内部使用.我们要讨论的是 this 的指向. this就是函数运行时自动生成的一个内部对象 下面介绍一下几种情况下, ...
- 理解js中this的指向
学习自原文 http://www.cnblogs.com/pssp/p/5216085.html后的一点小结(原文作者总结的很棒^_^)! 关于js中this的指向,在函数定义的时候还无法 ...
- js中this的指向
在js中this的指向对于新手来说一定是个难题,但是如果你真正理解了的话,也就没什么问题啦,下面就来讲讲this吧. JS中,this的值取决于调用的模式(调用对象),而JS中共有4种调用模式: 1. ...
- JS中的this 指向问题
我发现在对JS的学习中有很多朋友对this的指向问题还是有很大的误区或者说只是大致了解,但是一旦遇到复杂的情况就会因为this指向问题而引发各种bug. 对于之前学习过c或者是Java的朋友来说可能这 ...
- 轻松了解JS中this的指向
JS中的this指向一直是个让人头疼的问题,想当初我学的是天昏地暗,查了好多资料,看的头都大了,跟他大战了那么多回合,终于把它搞定个七八分,其实往往都是我们复杂化了,现在就让大家轻松看懂this的指向 ...
- 判断js中各种数据的类型方法之typeof与0bject.prototype.toString讲解
提醒大家,Object.prototype.toString().call(param)返回的[object class]中class首字母是大写,像JSON这种甚至都是大写,所以,大家判断的时候可以 ...
- JavaScript -- 时光流逝(五):js中的 Date 对象的方法
JavaScript -- 知识点回顾篇(五):js中的 Date 对象的方法 Date 对象: 用于处理日期和时间. 1. Date对象的方法 <script type="text/ ...
随机推荐
- Fiddler抓HTTPS接口数据,安装证书并不复杂,超详细的图文解说,不信你看!
@ 目录 前言 安装环境 配置网络 IP 端口 配置网络 浏览器打开下载链接 下载证书 安装证书 证书安装坑 前言 抓包是我测试工作中必须要学会的一个工具,我们都知道,抓取HTTPS接口里需要安装证书 ...
- 服务器使用matplotlib绘图
Two points: 1. change backend of matplotlib: import matplotlib.pyplot as plt plt.switch_backend('agg ...
- mybatis plus 一对多,多表联查的使用小记
阅读本博文需要有基础的mybatis以及mybatis plus知识,如果没有建议您了解相关的内容 本项目使用的是springboot构建的,数据库字段命名不严谨仅做演示测试使用,本文不做相关源码的解 ...
- 1-SQL Server2019安装
sql server2019安装 首先去官网下载(下载express版本): 打开安装程序 选择自定义 更改一下安装目录,点击安装 等待安装 等安装完成后,出现如下页面 选择SQL Server独立安 ...
- MySQL学习总结:提问式回顾 undo log 相关知识
原文链接:MySQL学习总结:提问式回顾 undo log 相关知识 1.redo 日志支持恢复重做,那么如果是回滚事务中的操作呢,也会有什么日志支持么? 也回滚已有操作,那么就是想撤销,对应的有撤销 ...
- Windows 11 正式版 Build 22000.194 官方简体中文版、英文版(消费者版、商业版)下载
昨天阿三正式发布了 Windows 11,版本号竟然是 22000.194,也就是 9 月 16 日的 测试版 22000.194,仅仅是文件改了个名,特别是消费者版本 hash 校验都是一致的. W ...
- php链接mysql,php链接mysql的常用方法
PHP连接MySQL数据库的几种方法 1.最简单的方式-mysql(面向过程) <?php $con = mysql_connect("localhost","ro ...
- Dapr + .NET Core实战(十一)单机Dapr集群
如何单机部署Dapr集群 第十篇讲过了K8S集群下如何使用Dapr运行程序,但是很多人一直在问如何单机下进行Dapr的负载,这节课我们来聊聊如何单机进行Dapr的负载. 首先要说的是单机下,通过 da ...
- Cobar提出的一种在分库场景下对Order By / Limit 的优化
搜索关注微信公众号"捉虫大师",后端技术分享,架构设计.性能优化.源码阅读.问题排查.踩坑实践. 本文已收录 https://github.com/lkxiaolou/lkxiao ...
- Java初步学习——2021.10.09每日总结,第五周周六
(1)今天做了什么: (2)明天准备做什么? (3)遇到的问题,如何解决? 今天学习了菜鸟教程实例部分 一.字符串 1.字符串比较--compareTo方法 public class Main { p ...