javaScript提供了一些函数方法帮助我们处理函数内部this的指向问题,常用的有bind()、call()、apply()三种方法

1.call() 方法调用一个对象。简单理解为调用函数的方式,但是它可以改变函数的this指向。

fun.call(arg,arg1,arg2,...)

arg:在fun函数运行是指定的this值

arg1,arg2:传递的其他参数

返回值就是函数的返回值。

使用场景:如果想要改变this的指向,调用这个函数的时候,可以使用call,比如继承

   var obj = {name: 'lingnan'}function fn(a, b) {console.log(this);console.log(a + b);}fn.call(obj, 1, 2)// call第一个作用可以调用函数,第二个可以改变函数内的this指向// call的主要作用是可以实现继承function Father(name, age, sex) {this.name = namethis.age = agethis.sex = sex}function Son(name, age, sex) {// console.log(this);Father.call(this, name, age, sex)}const son = new Son('张三', 23, '男')console.log(son);//{name: '张三', age: 23, sex: '男'}

2.apply方法

fun.apply(arg,[argArr])

arg:在fun函数运行时this的值

argArray:传递的值,必须包含在数组里面

apply主要更数组有关系,比如使用Math.max()求数组的最大值

 const obj = {name: '李四',age: 23}function fn(arr) {console.log(this);console.log(arr);}const str  = 'pink'fn.apply(obj, [str])// 也是可以调用函数 也可以改变函数内部的this指向// 注意:apply的参数是数组(伪数组)//  apply 的主要应用场景: 我们可以利用apply借助于数学内置对象求数组最大值 const arr = [34,202,42,33]const nameArr = ['张三','李四']var max = Math.max.apply(Math,arr)var min = Math.min.apply(Math,arr)console.log(max,min);var max1 = Math.max(...arr)var min1 = Math.min(...arr)console.log(max,min1);

3.bind方法

bind()方法的话并不会调用函数,但是能改变函数内部的this指向

fun.bind(arg,arg1,arg2,...)

arg:在fun函数运行时指定的this值

arg1,arg2:传递的其他参数

返回值由指定的this值和初始化参数改造的原函数拷贝

所以当我们只是想要改变this指向,并且不想调用这个函数的时候,可以使用bind方法

 <button>点击1</button>
<script>const obj = {name:'张三'}function fn(a,b){console.log(this);console.log(a+b);}// fn.bind(obj,1,2)此时的fn函数未调用,而是产生了改变this之后的新函数const f = fn.bind(obj,1,2)//返回的是原函数改变this之后产生的新函数f()//新函数被调用,this指向objvar btn =  document.querySelector('button')// btn.onclick = function(){//       this.disabled = true//       setTimeout(function(){//             console.log(this);//这时的this是指向window的,所以禁用的按钮恢复不了//             this.disabled = false//       },2000)// }btn.onclick = function(){console.log(this)//这里的this指向button元素节点this.disabled = truesetTimeout(function(){console.log(this);//这时的this是指向window的,所以禁用的按钮恢复不了this.disabled = false}.bind(this),2000)//这里的this和上面的this一样指向button元素节点,所以button按钮可以恢复
//注:还有一种方式就是setTimeout里面使用箭头函数:()=>{},此时的this指向的就是button}</script>

还有,如果call、apply、bind接收到的第一个参数是null、undefined时,可以忽略该参数,则此时只是函数调用。

例如:

function foo () {console.log(this.a)
}
var a = 2
foo.call()
foo.call(null)
foo.call(undefined)

输出:

2
2
2

好了,改变this指向的三种方法介绍到这里,如有错误,请读者纠正,谢谢!

javaScript改变this指向的三种方法相关推荐

  1. java浮点数化为整数_[Java教程]javascript浮点数转换成整数三种方法

    [Java教程]javascript浮点数转换成整数三种方法 0 2014-06-24 04:00:27 将浮点数转换成整数方法有很多,分享三种常用方法. Summary 暂时我就想到3个方法而已.如 ...

  2. JS行间改变css的方法,js改变css样式的三种方法推荐

    共用代码: this is a div var div=document.getElementById('div'); 第一种:用cssText div.style.cssText='width:25 ...

  3. 在JavaScript中重复字符串的三种方法

    In this article, I'll explain how to solve freeCodeCamp's "Repeat a string repeat a string" ...

  4. 在JavaScript中反转字符串的三种方法

    This article is based on Free Code Camp Basic Algorithm Scripting "Reverse a String" 本文基于F ...

  5. JS中this的指向与改变this指向的三个方法

    目录 一.this指向的分类 1.全局函数的调用 2.对象中函数的调用 3.setTimeout与setInterval中的this 4.事件绑定中的this 5.箭头函数中的this 6.构造函数中 ...

  6. JavaScript弹出对话框的三种方法

    三种方法 alert(); 最简单,将alert();括号内的内容弹出. confirm(); 与alert();类似,包含确认和取消按钮,点击确定confirm();方法会返回true,点击取消co ...

  7. javascript面象对象编程的三种方法

    <script>     /*      * 第一种,函数即类,利用prototype来模拟对象的方法,简单 ,不包括继承      */         //-------------- ...

  8. js 改变this指向的几种方法(个人学习笔记)

    1.call()和apply() 两中方法都能改变this指向,很类似,区别主要是第二个以后参数, call():第一个参数表示要把this指向的新目标,第二个之后的参数其实相当于传参,参数以,隔开  ...

  9. 静态html页面传递参数,javascript静态页面传值的三种方法分享

    一:JavaScript静态页面值传递之URL篇能过URL进行传值.把要传递的信息接在URL上.Post.htm function Post() { //单个值 Read.htm?username=b ...

最新文章

  1. 征途猎魔mysql数据库_猎魔征途-猎魔征途官方首测版 - 超好玩
  2. 【Netty】Netty 入门案例分析 ( Netty 模型解析 | Netty 服务器端代码 | Netty 客户端代码 )
  3. c++ double float 数值比较
  4. 博途v15做上位画面_1399元起!realme真我V15评测:当科技遇上国潮 越级还能这么玩...
  5. AI:2020年6月22日北京智源大会演讲分享之机器感知专题论坛—14:50-15:30吴玺宏教授《一种具身自监督学习框架:面向任何语种语音的音系构建任务》
  6. 多点子接口的帧中继配置(MP SubInterface FrameRealy)
  7. 从php传过来的是字符串吗,PHP 字符串
  8. 路由器DHCP和DHCP中继的配置
  9. sql 日期间隔排查双休_免费教程《图解SQL面试题》
  10. 《统计学习方法》第7章 课后题答案
  11. loadrunner下载地址
  12. 微软私有云部署及讲解专题
  13. 戴尔计算机更新程序,戴尔电脑怎么关闭自动更新系统
  14. ES6之你应该知道的知识(一)
  15. HDOJ4699 Editor 栈
  16. Springboot 静态资源路径配置 实例介绍
  17. 面矢量栅格化(python)
  18. 笔记·Pandas几类数据读写方法对比——csv,parquet,feather和pickle
  19. 做你喜欢做的事,财富会随之而来
  20. 国内常用公共DNS服务器、各省运营商DNS服务器汇总 1

热门文章

  1. dojo引用html模板,深入浅出dojo/request-本地HTML文件 带参数方案-遮罩层《一》_169IT.COM...
  2. 干货 | 互联网广告数据的匿名化方案研究
  3. 做过SEO优化的网站与普通站的区别在哪里
  4. Android S 新特性:应用行为更改
  5. Latex中排序的使用方法
  6. DCS、PLC与SCADA的区别
  7. Cruehead-CrackMe-3
  8. 计算机基础 CMOS
  9. KaTex的一个简单例子
  10. ESP8266 MP3制作——关于SelectionList从源码中改代码的一次经历