首先我们要知道,JS中函数调用共有四种方法。call() 就是其中一种。我先简单的的说明以下四种方法:
我们先定义一个函数:
function test(){
/**do something**/
}
1.第一种,也就是最常见的调用方法:
test();
2.第二种:对象调用
我们需要把定义的函数放到一个对象里面(obj)
var obj={
test:function (){
/**do something**/
}
}
调用:
obj.test();
3.第三种:构造函数调用
var tmp = new test();
4.第四种:使用call()或者applay()
这种方法调用的时候必须传递一个参数,只要不空着即可。
test.call(null)
其实,以上调用方式,隐含的传递了一个变量:this。
call 和 apply 都是可以改变this 指向的问题, call 方法中传递参数要求一个一个传递参数。 但是apply 方法要求传递参数是一个数组形式。
call方法定义:调用一个对象的一个方法,以另一个对象替换当前对象。实现(多重)继承。
语法:
call(thisobj,[arr1,arr2])
示例:
let arr = [10,20,30,],
obj = {};
function fn (x, y, z){
fn.apply(obj,arr)// x->10 y-> 20 z->30
fn.call(obj,arr)//x->[10,20,30] y-> undefined z->undefined
fn.call(obj,...arr)
}
function myfunc1(){
this.name = 'Lee';
this.myTxt = function(txt) {
console.log( 'i am',txt );
}
}
function myfunc2(){
myfunc1.call(this);
}
var myfunc3 = new myfunc2();
myfunc3.myTxt('Geing'); // i am Geing
console.log (myfunc3.name); // Lee
call 的线性能要比apply 的性能要好一些, (尤其传递给给函数的参数超过三个时候), call 方法的性能要更高一些, 在做项目要开发的时候可以使用call 要多一些。
bind(): 方法也可以改变this 指向的问题, 但是函数并没有立即执行(只是改变了this 指向问题)