16.说一说call apply bind的作用和区别?
得分点:
①
bind
改变this
指向不直接调用、
②call
和apply
改变this
指向直接调用、
③apply
接收第二个参数为数组、
④call
用于对象的继承、
⑤ 伪数组转换成真数组、
⑥apply
用于找出数组中的最大值和最小值以及数组合并、
⑦bind
用于vue
或者react
框架中改变函数的this
指向
标准回答
call、apply、bind
的作用 :
都是改变函数运行时的this
指向。
bind
和call
、apply
在使用上有所不同:
①bind
在改变this
指向的时候,返回一个改变执行上下文的函数,不会立即执行函数,而是需要调用该函数的时候再调用即可,但是call
和apply
在改变this指向的同时执行了该函数。
②bind
只接收一个参数,就是this
指向的执行上文
③call
、apply
接收多个参数,第一个参数都是this
指向的执行上文,后面的参数都是作为改变this
指向的函数的参数。但是call
和apply
参数的格式不同,call
是一个参数对应一个原函数的参数,但是apply
第二个参数是数组,数组中每个元素代表函数接收的参数,数组有几个元素函数就接收几个元素。
加分回答
call
的应用场景:
对象的继承,在子构造函数这种调用父构造函数,但是改变this指向,就可以继承父的属性
function superClass() {
this.a = 1
this.print = function() {
console.log(this.a)
}
}
function subClass() {
superClass.call(this) // 执行superClass,
}
并将superClass
方法中的this指向subClass();
借用Array
原型链上的slice
方法,把伪数组转换成真数组
let domNodes = Array.prototype.slice.call(document.getElementsByTagName("div"));
apply
的应用场景:
Math.max,获取数组中最大、最小的一项
let max = Math.max.apply(null, array);
let min = Math.min.apply(null, array);
实现两个数组合并
let arr1 = [1, 2, 3];
let arr2 = [4, 5, 6];
Array.prototype.push.apply(arr1, arr2);
console.log(arr1); // [1, 2, 3, 4, 5, 6]
bind
的应用场景:
在
vue
或者react
框架中,使用bind
将定义的方法中的this
指向当前类
💞💖💓💗每个时代,
✨🌟⭐️💫都悄悄犒赏会学习的人。