转载自https://www.cnblogs.com/zpzl/p/6690451.html
概念:
1.call 方法可以用来代替另一个对象调用一个方法,改变函数内部的this指向。
2.call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。简单讲就是借用上下文环境
3.apply()和call()异曲同工,
使用:
1.第一个参数是一个对象,第二个参数是数组里面所有的参数
2.apply()第一个参数也是一个对象,第二个参数是一个数组
实例a:
1 var number = [-15,-1,0,17,59,108];
2 var maxInNumber = Math.max.call(Math,-15,-1,0,17,59,108);
3 var maxInNumber = Math.max.apply(Math,number);
4 var maxNumber = Math.max(-1,12,59);
5 console.log(maxNumber); //59
6 console.log(maxInNumber); //108
这个例子的maxInNumber的this指向的方法变成了Math.max()这个方法本身,所以第六行输出了108
实例b:
function add(a,b){
this(a,b);
console.log(a+b); //2
};
function sub(a,b){
console.log(a-b); //4
};
add.call(sub,3,1);
这个实例 首先 add.call(sub,3,1)执行的是 add方法, 然后,add执行的时候, this已经变成了 sub这个方法本身,所有this(a,b)这一句输出了2
实例c:
function Movie(){
this.name = "Movie";
this.showName = function(){
console.log(this.name);
}
}
function Book(){
this.name = "Book";
}
var movie = new Movie();
var book = new Book();
/**通过call()或者apply()方法,将原本属于Movie对象的showName()方法交给对象book使用**/
movie.showName.call(book,""); // Book 第二个参数所有的参数
movie.showName.apply(book,[]); // Book 第二个参数是一个数组
这个实例通过call()或者apply()方法,将原本属于Movie对象的showName()方法交给对象book使用
实例d:
1 function Movie(name){
2 this.name = name;
3 this.showName = function(){
4 console.log(this.name);
5 }
6 }
7 function Book(name){
8 Movie.apply(this,[name]);
9 // Movie.call(this,name); 10 }
11 var book = new Book("Javascript"); //book对象可以调用Movie对象上的方法和属性
12 book.showName(); //Javascript