一、this概念
this
一般存在于函数中,表示所在函数的执行对象。相当于一个指针,但只有在函数执行时才被指向具体的对象,如果函数没有执行,this将没有意义。
注:
- 函数的默认执行(this的默认绑定),如果没有明确隶属对象的函数,this执行window
- 当函数被当作事件处理函数执行时,this指向事件源
- 当函数被赋值给某个对象的方法时,通过这个对象的方法执行函数叫隐式绑定,this为当前对象
二、改变this指向的方法
- call()
- 功能:改变原函数的this指向,并立即执行这个新函数(新函数不被保存)
- 参数:多个|第一个:要改变this指向的原函数 /其他参数(可是多个)
- 返回值:原函数的返回值
- 不会改变原数据
function fn(a,b,c,d){
console.log(a)
console.log(this);
return "原函数的返回值"
}
fn(123);
fn.call(123);
fn.call("hello");
fn.call(true);
var res = fn.call("hello","world","asd","qwe","zxc")
console.log(res);
- apply
- 功能:改变原函数的this指向,并立即执行这个新函数(新函数不被保存)
- 参数:两个|第一个:要改变this指向的原函数 、第二个参数:必须是数组(覆盖原函数的arguments)
- 返回值:原函数的返回值
- 不会改变原数据
function fn(a,b,c,d){
console.log(a)
console.log(this);
return "原函数的返回值"
}
fn(123);
var res = fn.apply("hello", [123,"asd"])
console.log(res)
- bind()
- 功能:改变原函数this指向,返回一个新函数,新函数被保存到bind的返回值
- 参数:多个|第一个:要改变this指向的原函数 、其他参数:覆盖原数据的参数
- 返回值:返回一个和原函数一样的被改变this指向的新函数
- 不会改变原数据
function fn(a,b,c,d){
console.log(a)
console.log(this);
return "原函数的返回值"
}
fn(123);
var res = fn.bind("hello",123,"qwe");
console.log(fn);
console.log(res);
console.log(res === fn); // f
res();
三、隐式丢失
- 通过函数的call和apply或bind方法,强行修改当前函数中的this指向,叫强制(显示)绑定,显示绑定可以用来解决隐式丢失。
- 通过new关键字绑定,当一个函数被new执行时,函数内部的this会指向new出来的对象
四、三种方法的不同点
- call和apply改变的新函数没有被保存,bind的新函数被保存到了bind的返回值。
- call和bind可以在第二位后跟多个参数,apply只有两个参数,第二个参数只能为数组形式。
- call和bind覆盖原函数的参数,apply覆盖原数据的arguments。
- call和apply返回值为原函数的返回值,bind返回一个跟原函数一样的被改变this指向的新函数。