1.call
:函数名.call(this的指向,参数1,参数2)
改变this指向后原函数会立即执行,且此方法只是临时改变this指向一次
function fun(){
console.log(this);
}
fun();//window
fun.call(document);
fun.call(1); //Number {1}
fun.call("1"); //String {"1"}
var name = "杜甫"; //window.name
var obj1 = {
name:'`在这里插入代码片`李白',
toString:function(){
console.log(this.name);
}
}
var obj2 = {
name:'白居易',
toString:function(){
console.log(this.name);
}
}
obj2.toString(); //白居易
obj2.toString.call(obj1);//李白
obj2.toString.call(window); //杜甫
当第一个参数为null、undefined的时候,默认指向window(在浏览器中)
function fn(...args){
console.log(this,args);
}
fn.apply(null,[1,2]); // this指向window
fn.apply(undefined,[1,2]); // this指向window
2.apply
: 函数名.apply(this,[参数1,参数2])
跟apply一样,改变this指向后原函数会立即执行,且此方法只是临时改变this指向一次
function fun1(a,b){
console.log(this);
console.log((a+b));
}
fun1.call(obj1,10,20);
fun1.apply(obj1,[10,20]);
同样的,当第一个参数为null、undefined的时候,默认指向window(在浏览器中)
function fn(...args){
console.log(this,args);
}
fn.call(null,[1,2]); // this指向window
fn.call(undefined,[1,2]); // this指向window
3.bind
bind方法和call很相似,第一参数也是this的指向,后面传入的也是一个参数列表,改变this指向后不会立即执行,而是返回一个永久改变this指向的函数
function fun2(){
console.log(this);
}
var f = fun2.bind(obj1); // function fun2(){console.log(obj1));}
f();
从上面可以看到,apply、call、bind三者的区别在于:
- 三者都可以改变函数的
this对象指向 - 三者第一个参数都是
this要指向的对象,如果如果没有这个参数或参数为undefined或null,则默认指向全局window - 三者都可以传参,但是
apply是数组,而call是参数列表,且apply和call是一次性传入参数,而bind可以分为多次传入 bind是返回绑定this之后的函数,apply、call则是立即执行