200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > javaScript改变this指向的三种方法

javaScript改变this指向的三种方法

时间:2020-12-11 00:50:54

相关推荐

javaScript改变this指向的三种方法

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 = 2foo.call()foo.call(null)foo.call(undefined)

输出:

222

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。