call
call() 方法调用一个函数, 其具备一个指定的this值和分别地提供的参数(参数的列表)。数组
apply
apply() 方法调用一个具备给定this值的函数,以及做为一个数组(或相似数组对象)提供的参数。app
二者之间的区别
call()方法接受的是若干个参数的列表
apply()方法接受的是一个包含多个参数的数组。函数
栗子1:经过call实现继承this
function Product(name, price) { this.name = name; this.price = price; if (price < 0) { throw RangeError( 'Cannot create product ' + this.name + ' with a negative price' ); } } function Food(name, price) { Product.call(this, name, price); this.category = 'food'; } //等同于 function Food(name, price) { this.name = name; this.price = price; if (price < 0) { throw RangeError( 'Cannot create product ' + this.name + ' with a negative price' ); } this.category = 'food'; }
栗子2:经过apply实现ES6的展开运算符功能prototype
let values = [25, 50, 75, 100]; console.log(Math.max.apply(null, values)); //ES6写法 console.log(Math.max(...values));
栗子3:经过call扩展做用域code
var color = 'red'; let box = { color: 'blue'; }; function sayColor() { alert(this.color); } sayColor(); //red,做用域在window sayColor.call(this); //red,做用域在window sayColor.call(window); //red,做用域在window sayColor.call(box); //blue,做用域在box,对象冒充
使用 call() (或 apply() )来扩充做用域的最大好处,就是对象不须要与方法有任何耦合关系。对象