call和apply函数可以改变对象调用函数中this的指向。
call函数: 第一个参数值指向改变的那个对象,从第二个参数起,是调用函数中的实际参数,顺序和个数是一一对应的。
apply函数: 第一个参数值指向改变的那个对象,从第二个是数组,是调用函数中的实际参数,顺序和个数是一一对应的。
function Person(name, age) {
this.name = name;
this.age = age;
this.sing = function() {
console.log(this);
}
}
var obj = new Person(‘小红’, 6);
var obj1 = new Person(‘小明’, 8);
obj.sing(); //Person {name: “小红”, age: 6, sing: ƒ}
在构造函数中,this指向的是当前实例对象,调用obj.sing();this指向的就是obj
obj.sing.call(obj1); //Person {name: “小明”, age: 8, sing: ƒ}
call()函数可以改变对象调用函数中this的指向,call()中传的参数是obj1,此时call()函数已经将obj的指向改变成了obj1。
function add(a, b) {
console.log(this);
console.log(a + b);
}
add(1, 2); //Window 3
在普通函数中,this指向的是window,所以调用add(),在控制台打印this输出的是window。
add.call(obj, 1, 2);//Person {name: “小红”, age: 6, sing: ƒ} 3
call()函数改变了this的指向,使this由原来的window变成了指向obj,后面的两个参数1和2是传到add()中的实参,最后计算的结果是3。
add.apply(obj,[1,2]);//Person {name: “小红”, age: 6, sing: ƒ} 3
apply()函数改变了this的指向,使this由原来的window变成了指向obj,后面的两个参数1和2是传到add()中的实参,最后计算的结果是3。