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/ ...
随机推荐
- 分组密码(四)AES算法① — 密码学复习(七)
介绍完S-PN型结构之后,下面介绍AES算法.由于内容比较多所以将其分为两篇来介绍,本篇主要讲AES的历史时间节点.产生背景.与DES的对比.算法框图(粗略)以及一些数学基础. 7.1 AES的历史时 ...
- 神器----IntelliJ IDEA基本配置
介绍 首先是百度百科对于 IDEA 的介绍 IDEA 全称 IntelliJ IDEA,是java编程语言开发的集成环境.IntelliJ在业界被公认为最好的java开发工具,尤其在智能代码助手.代码 ...
- .NET跨平台实践:.NetCore、.Net5/6 Linux守护进程设计
之前,我写过两篇关于用C#开发Linux守护进程的技术文章,分别是<.NET跨平台实践:用C#开发Linux守护进程>和<.NET跨平台实践:再谈用C#开发Linux守护进程 - 完 ...
- 初探计算机网络之TCP/IP网络协议
网络协议 在计算机诞生以来,从最原始的单机模式到现在多台计算机协同工作,形成计算机网络,从前很难想象的信息共享.多机合作.大规模计算在今天也早已成了现实.在早期,计算机网络需要解决的痛点,就是怎样 ...
- NOIP 模拟 十一
T1 math 分析性质,对于 $$ ax+by=c$$ 有 $$ gcd(x,y)|c$$ 所以 $$ gcd(a_1,a_2 .....,a_n)|num$$ 换句话说就是最后得到的数一定是 GC ...
- Bayou复制分布式存储系统
本文主要参考文献[1]完成. 第1章导读 Bayou是一个复制的.弱一致性的存储系统,用于移动计算环境.为了最大化可用性,Bayou为用户提供了可以任意读写访问的副本.Bayou的设计侧重于为应用程序 ...
- C#开发BIMFACE系列43 服务端API之图纸拆分
BIMFACE二次开发系列目录 [已更新最新开发文章,点击查看详细] 在上一篇博客<C#开发BIMFACE系列42 服务端API之图纸对比>的最后留了一个问题,在常规业务场景下,一 ...
- C++类结构体与json相互转换
1. 背景与需求 之前写C#的时候,解析json字符串一般使用的是开源的类库Newtonsoft.Json,方法十分简洁,比如: class Project { public string Input ...
- 一次OutOfMemoryError: GC overhead limit exceeded
现象: 由于需要将mysql表中的过期数据在凌晨定时读取出过滤后转入到MongoDB,一个转换SQL达到百行,而且有几十个,集中运行后程序反馈异常: Handler dispatch failed; ...
- Vue3学习(二)之集成Ant Design Vue
一.集成Ant Design Vue npm install ant-design-vue@2.0.0-rc.3 --save 兼容性 Ant Design Vue 2.x 支持所有的现代浏览器. 如 ...