一、函数被调用默认传入的两个参数
在js中,所有的函数再被调用的时候都会默认传入两个参数
,
一个是this
,还有一个是arguments
。
在默认情况下this都是指当前的调用函数的对象
但是有时候我们需要改变this的指向
,也就是说使函数可以被其他对象来调用,那么我们应该怎样做呢?这时候我们就可以使用call,apply和bind方法
了。
二、this指向问题
this指向 = 谁调用,指向谁(这是错误的!!!)
this永远指向最后一个调用它的那个对象(正解)
如何解决this指向问题
?
1.使用ES6中箭头函数
2.函数内部使用_this = this
3.使用apply,call,bind方法
4.new实例化一个对象
三、call,apply和bind方法的来历
在js中所有的函数都是Function的实例
,而且对于Function来说,它的原型即Function.prototype中含有很多东西
,其中call,apply和bind方法就是Function原型中的方法
,所以根据原型的规则,所有的函数都可以使用原型中属性和方法
,所以来说,对于所有的函数都可以使用call,apply和bind方法。
四、call,apply和bind方法的区别
1、call、apply与bind都用于改变 this 绑定
2、call、apply 在改变 this 指向的同时还会执行函数,一次性的。
不同的是 call方法传递函数调用形参是以散列形式,
而 apply 方法的形参是一个数组。
在传参的情况下,call的性能要高于 apply,
因为 apply 在执行时还要多一步解析数组。
3、bind 在改变 this 后是返回一个全新的绑定函数,即返回一个新的函数,
不直接执行函数。并且此后 this 的指向无法再次通过 call、apply、bind 改变。
五、call
使用一个指定的 this 值
和单独给出的一个或多个参数来调用一个函数
。
function.call(thisArg, arg1, arg2, ...)
[thisArg] 必选的,但是你也可以不写,
但是不写,那你用这个方法还有什么意义?
指定为 null 或 undefined 时会自动替换为指向全局对象
[arg1, arg2, ...] 参数列表
5.1.例子
let objCall ={
name: "我是 Call"
}
function fn() {
console.log('参数 => ', ...arguments)
console.log('name => ', this.name)
}
fn.call(objCall , 1,2,3)
// 参数 => 1 2 3
// name => 我是Call
六、apply
调用一个具有给定 this 值的函数
,以及以一个数组(或类数组对象)的形式
提供的参数
。
func.apply(thisArg, [argsArray])
[thisArg] 必选的 同 call 一样
[argsArray] 可选的
6.1、例子
let objApply ={
name: "我是 Apply"
}
function fn() {
console.log('参数 => ', ...arguments)
console.log('name => ', this.name)
}
fn.apply(objApply, [1,2,3])
// 参数 => 1 2 3
// name => 我是 Apply
七、bind
创建一个新的函数
,在 bind() 被调用时,这个新函数的 this 被指定为 bind() 的第一个参数,而其余参数将作为新函数的参数,供调用时使用。
function.bind(thisArg,arg1,arg2,arg3,....)
7.1、例子
let objBind ={
name: "我是 Bind"
}
let objApply ={
name: "我是 Apply"
}
function fn() {
console.log('参数 => ', ...arguments)
console.log('name => ', this.name)
}
let bfn = fn.bind(objBind, 1,2,3);
//需要自己主动执行
bfn();
// 参数 => 1 2 3
// name => 我是 Bind
网友评论