apply与call的区别
apply接受参数数组作为对象,call接受参数列表;
利用apply将一个数组的值加入到另一个数组
var a = [1,2,3]
var b = ['ee', 'gg']
a.push.apply(a, b); // 第一个入参是push函数指向的对象,第二个入参是apply函数的参数
console.info(a);
利用apply函数可以避免一些需要循环遍历的方法
nums = [1,2,3,4,5,6,7]
var maxnum = Math.max.apply(null, nums)
var minnum = Math.min.apply(null, nums)
console.log(maxnum, minnum)
利用call函数写继承父类的方法
function Product(name, price) {
this.name = name;
this.price = price;
}
function Food(name, price) {
Product.call(this, name, price); // 子类的传参覆盖父类的传参
this.category = 'FOOD';
}
function Toy(name, price) {
Product.call(this, name, price); //子类
this.category = 'TOY';
}
var newToy = new Toy('flower', 12);
var newFood = new Food('tomato', 5);
console.log(newToy)
console.log(newFood)
用call方法调用一个函数不传第一个参数
严格模式下,返回undefined;
use 'strict'
var a = 'eee';
function display() {
console.log(this.a);
}
display.call(); // Cannot read the property of 'a' of undefined
普通模式下, 可以正常返回(this默认为全局this对象)
var a = 'eee';
function display() {
console.log(this.a);
}
display.call(); // eee
用call调用函数并改变上下文this
var a = 10;
function display() {
console.log(this.a);
}
var obj = {
a: 111
}
display.call(obj); // 111
display() // 10