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() )來擴充做用域的最大好處,就是對象不須要與方法有任何耦合關係。對象